我有一个角色向量
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)
没有获得所需的输出。
如何解决?一个代码片段将不胜感激。 感谢。
答案 0 :(得分:1)
我们通过首先拆分&#39; var1&#39;为grepl
创建一个模式字符串(&#39; pat&#39;)。按空格'\\s+'
。输出将是一个列表。我们使用sapply
循环列表,将paste
与collapse= '|'
一起使用,然后将整个向量折叠为另一个paste
的单个字符串。在|
中使用OR
的模式时,grepl
充当v1
。 sum
向量(&#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"