将ColumnA中的任何单词与ColumnB中的任何单词匹配

时间:2015-12-10 20:23:16

标签: r string-matching

我花了很多时间寻找解决方案,并没有遇到任何问题。简单地说,我可以说下面有一个数据框:

ColumnA   ColumnB
Blue       Red
Blue       Blue
Blue       Red Blue
Blue Red  Yellow Blue
Blue Red  Yellow Blue Green
Red    Yellow Blue Green

我想在两列中都有一个单词时返回一个匹配项。例如,将返回一个如下所示的表:

 ColumnA   ColumnB            Match
 Blue      Red                False
 Blue      Blue               True
 Blue      Blue Red           True
 Blue Red  Yellow Blue        True
 Blue Red  Yellow Blue Green  True
 Red       Yellow Blue Green  False 

我看过mapply使用grepl以及基于向量和关键字的其他形式的匹配,但我似乎无法找到适用于此的任何内容。

3 个答案:

答案 0 :(得分:3)

同样的想法,但我认为使用strsplit进行矢量化并使用mapply更为有效:

mapply(function(x,y)any(x%in%y) ,
        strsplit(dx$ColumnA, " "),
        strsplit(dx$ColumnB," "))
## [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE

答案 1 :(得分:1)

使用strsplit拆分为单词,然后一次使用%in%一行。

数据:

dd <- read.csv(text="
ColumnA,ColumnB
Blue,Red
Blue,Blue
Blue,Red Blue
Blue Red,Yellow Blue
Blue Red,Yellow Blue Green
Red,Yellow Blue Green")

单线匹配功能:

matchFun <- function(a,b) {
    aa <- strsplit(a," ")[[1]]
    bb <- strsplit(b," ")[[1]]
    any(aa %in% bb)
}

应用于行:

apply(dd,1,function(x) { matchFun(x[1],x[2]) })
## [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE

答案 2 :(得分:0)

还可以使用applyintersect

apply(df1, 1, function(x){length(intersect(unlist(strsplit(x[1], " ")), 
                                           unlist(strsplit(x[2], " "))))>0})
# [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE