【发布时间】:2021-09-16 12:35:08
【问题描述】:
这是对r - for loop to compare 2 dataframes all by all rows 的跟进,但应用了不同的匹配函数(stringr::str_detect())。
我正在尝试逐行比较数据框 d1 中的 2 列与数据框 d2 中的 2 列。为了说明我创建虚拟数据集的问题:
d1 <- data.frame(
a = c("a","b","c", "d"),
b = c("aa", "bbb", "ccc", "d")
)
d2 <- data.frame(
a = c("a", "a", "d", "b"),
b = c("aaa", "bbb", "ddd", "bbb")
)
理想情况下,我想标记d1 中的所有行,我可以在d2 的至少一行中找到匹配项。这就是提供所需结果的原因:
output <- matrix(nrow = nrow(d1), ncol =nrow(d2))
for (i in 1:nrow(d1)) {
for (j in 1:nrow(d2)) {
output[i,j] = ifelse(
d1$a[i] == d2$a[j] & str_detect(d2$b[j], d1$b[i]),
1,
0)
}
}
d1$flag <- apply(output,1,max)
d1
由于我的 d1 表的行数会变得相当大,因此矩阵的大小也会变得很大。有没有更好的方法来编写这个循环,而不是矩阵,我创建一个具有每行最大值的向量并且内存不会爆炸?
【问题讨论】:
-
您使用
str_detect(即子字符串)而不是严格相等是否有原因? -
是的,我无法分享的原始示例需要 str_detect。我改变了上面的例子
-
我们不要求您提供真实数据,而是提供与真实数据反映相同问题的示例
-
上面的例子反映了同样的问题。使用
stringr::str_detect是因为我需要检查 d1$b 是否包含在 d2$b 中