R中的正则表达式 - 将一列与另一列进行比较

时间:2011-06-16 21:45:50

标签: regex r

我目前有一个数据集,其中有两列我想比较。在一列中,我有一个我想要搜索的字符串(让我们称之为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"

2 个答案:

答案 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只能获得一次命中。如果你想搜索所有元素(或使用等效的循环),你必须遍历元素。

如果你想逐行比较,那么简单==就足够了。