我花了很多时间寻找解决方案,并没有遇到任何问题。简单地说,我可以说下面有一个数据框:
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
以及基于向量和关键字的其他形式的匹配,但我似乎无法找到适用于此的任何内容。
答案 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)
还可以使用apply
和intersect
。
apply(df1, 1, function(x){length(intersect(unlist(strsplit(x[1], " ")),
unlist(strsplit(x[2], " "))))>0})
# [1] FALSE TRUE TRUE TRUE TRUE FALSE