【发布时间】:2015-06-15 20:29:51
【问题描述】:
假设我有两列字符串:
library(data.table)
DT <- data.table(x = c("a","aa","bb"), y = c("b","a","bbb"))
对于每一行,我想知道 x 中的字符串是否存在于 y 列中。循环方法是:
for (i in 1:length(DT$x)){
DT$test[i] <- DT[i,grepl(x,y) + 0]
}
DT
x y test
1: a b 0
2: aa a 0
3: bb bbb 1
这个有矢量化的实现吗?使用grep(DT$x,DT$y) 只使用x 的第一个元素。
【问题讨论】:
-
@LegalizeIt 是的,我不是在寻找 a == b 的情况,而是在行之间存在部分字符串匹配的情况。以上测试 x 是否在 y 中,但如果这很重要,您可以重新运行其他方式。我不确定您所说的“为什么 y 列中没有“a”?”
-
@DavidArenburg 好主意,但仅适用于 x 唯一时。我试过
DT[, test := grepl(x, y) + 0, by = .I]但得到相同的argument 'pattern' has length > 1 and only the first element will be used错误。也就是说,可能有一个解决方案,您首先调用 DT[, RowI := .I],然后使用by = rowI -
它不仅在
x唯一时有效。例如,对于DT <- data.table(x = c("a","aa","aa","bb"), y = c("b","a","a", "bbb"))非常有效。 -
@DavidArenburg 你是对的......它会为每组 x 将相同的参数传递给 grepl,这都是相同的输入。聪明的。我正在对所有答案进行基准测试,并将给出最好的答案。
-
哦,我知道你在那里做了什么。你问这个赏金问题......
标签: regex r data.table