R匹配短语中的整个单词

时间:2015-05-22 22:06:03

标签: r string grep pattern-matching

我有一个角色向量

var1 <- c("pine tree", "forest", "fruits", "water")

和一个清单

var2 <- list(c("tree", "house", "star"),  c("house", "tree", "pine tree", "tree pine", "dense forest"), c("apple", "orange", "grapes"))

我想将var1中的单词与var2中的单词匹配,并提取var2中的最大匹配元素。例如,

[[1]]
[1] "tree"  "house" "star" 

与var1

匹配1次
[[2]]
[1] "house"        "tree"         "pine tree"    "tree pine"    "dense forest"

与var1

有4个匹配项
[[3]]
[1] "apple"  "orange" "grapes"

与var1

匹配0

所需的输出如下:

[[2]]
[1] "house"        "tree"         "pine tree"    "tree pine"    "dense forest"

我试过

sapply(var1, grep,  var2, ignore.case=T, value=T)

没有获得所需的输出。

如何解决?一个代码片段将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:1)

我们通过首先拆分&#39; var1&#39;为grepl创建一个模式字符串(&#39; pat&#39;)。按空格'\\s+'。输出将是一个列表。我们使用sapply循环列表,将pastecollapse= '|'一起使用,然后将整个向量折叠为另一个paste的单个字符串。在|中使用OR的模式时,grepl充当v1sum向量(&#39; v1&#39;)将用于对list&#39; var2&#39;进行子集化。根据问题中描述的条件。

 pat <- paste(sapply(strsplit(var1, '\\s+'), function(x)
     paste(unique(c(x, paste(x, collapse=' '))), collapse='|')),
     collapse='|')
 v1 <- sapply(var2, function(x) sum(grepl(pat, x)))
 v1
 #[1] 1 4 0
 var2[which.max(v1)]
 #[[1]]
 #[1] "house"        "tree"         "pine tree"    "tree pine"    "dense forest"