【问题标题】:R match words in listR匹配列表中的单词
【发布时间】:2015-05-22 15:34:10
【问题描述】:

我有一个字符向量

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

还有一个列表

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

我想将 var1 中的单词与 var2 中的单词进行匹配,并根据匹配的单词数对列表元素进行排名。例如,

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

与 var1 有 2 个匹配项

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

与 var1 有 1 个匹配项

[[3]]
[1] "apple"  "orange" "grapes"

与 var1 有 0 个匹配项

所需的输出是以下等级:

[1] "house"  "tree"   "dense forest"
[2] "tree"  "house" "star"
[3] "apple"  "orange" "grapes"

我试过了

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

没有得到想要的输出。

如何解决?代码 sn-p 将不胜感激。 谢谢。

编辑:

如上所述,问题已从单个单词匹配编辑为短语中的单词匹配。

【问题讨论】:

    标签: r list string-matching


    【解决方案1】:

    你可以试试

    var2[[which.max(lapply(var2, function(x) sum(var1 %in% x)))]]
    [1] "house"  "tree"   "forest"
    

    来自 OP 的最后修改和@franks 评论

    var2[order(-sapply(var2, function(x) sum(var1 %in% x)))]
    [[1]]
    [1] "house"  "tree"   "forest"
    [[2]]
    [1] "tree"  "house" "star" 
    [[3]]
    [1] "apple"  "orange" "grapes"
    

    【讨论】:

    • OP改变了想要的输出,我建议var2[order(-sapply(var2, function(x) sum(var1 %in% x)))] 另外,在最新的R中,有一个lengths函数,所以你可以做lengths(sapply(var2,intersect,var1))
    • 感谢@Frank,我不知道我可以像访问向量一样访问列表元素。
    • @Frank 这很优雅
    • @john 在此站点上,发布新问题通常比更改已经有答案的问题更好(基本上使答案无效)。我认为“当 x 时我会接受”也有些糟糕。我们大多数人这样做是为了帮助和学习,而不是为了上网点。无论如何,只是让你知道;没什么大不了的。
    猜你喜欢
    • 2021-10-19
    • 2020-02-02
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多