我目前有一个数据集,其中有两列我想比较。在一列中,我有一个我想要搜索的字符串(让我们称之为A列)。在第二列(我们称之为B列)是一些更多的字符串。
问题是两列都有不同的内容,因此正则表达式中搜索的模式可能会从一行更改为另一行。通常,当我在列中搜索特定字符串时,我会使用以下内容:
df$output <- NA
df$output[grep("TARGET_STRING", df$column_B)] <- "STRING_FOUND"
然而,现在我正在尝试这样做:
df$output[grep(df$column_A, df$column_B)] <- "STRING_FOUND"
不幸的是,这会产生错误:
参数'pattern'的长度为&gt; 1和 只使用第一个元素
我已经尝试了各种方法来解决这个问题,似乎无法找到一个简单的解决方案,而且我确信必须有一个。我可以看出为什么它会抛出一个错误(我想),但我不知道如何解决它。我需要做些什么来使正则表达式工作?
编辑:这是测试数据。我一直在用它来探索它:
column_A <- c("A", "A", "B", "B")
column_B <- c("A", "zzz", "B", "zzz")
greptest <- data.frame(column_A, column_B)
greptest$output<-NA
greptest$output[grep(greptest$column_A, greptest$column_B)] <- "STRING_FOUND"
答案 0 :(得分:4)
您可以编写一个包裹grepl
的函数,然后使用apply
:
grepFun <- function(rw){
grepl(rw[1],rw[2],fixed=TRUE)
}
xx <- apply(greptest,1,grepFun)
greptest$output[xx] <- "STRING_FOUND"
你已经排除了我的答案,但我认为我会使用ddply
提供另一个更高效的版本:
grepFun1 <- function(x){
ind <- grepl(x$column_A[1],x$column_B,fixed=TRUE)
x$output <- NA
x$output[ind] <- "STRING_FOUND"
x
}
ddply(greptest,.(column_A),.fun=grepFun1)
如果您对column_A的值有很多重复,则此版本可能会更快。
答案 1 :(得分:2)
我不确定你的预期结果是什么,但这是我的代码:
> grep(greptest[1,"column_A"], greptest$column_B)
[1] 1 2
> grep(greptest[2,"column_A"], greptest$column_B)
integer(0)
> grep(greptest[3,"column_A"], greptest$column_B)
[1] 3 4
> grep(greptest[4,"column_A"], greptest$column_B)
integer(0)
> cbind(column_A,column_B,column_A==column_B)
column_A column_B
[1,] "A" "A" "TRUE"
[2,] "A" "zzz" "FALSE"
[3,] "B" "B" "TRUE"
[4,] "B" "zzz" "FALSE"
我在grep代码中切换了A和B,因为否则每个grep只能获得一次命中。如果你想搜索所有元素(或使用等效的循环),你必须遍历元素。
如果你想逐行比较,那么简单==就足够了。