【问题标题】:R vector-vector matching with ordered indices与有序索引匹配的 R 向量向量
【发布时间】:2015-05-07 12:37:46
【问题描述】:

这里我有两个字符串向量,它们的顺序很重要,不能更改。

vec1 <- c("carrot","carrot","carrot","apple","apple","mango","mango","cherry","cherry")
vec2 <- c("cherry","apple")

我想知道 vec2 中的元素是否出现在 vec1 中,如果出现,在哪里(索引/位置)以及以什么顺序。

我尝试了which(vec1 %in% vec2),它给出了4 5 8 9。这些是正确的索引,但顺序错误。我尝试了match(vec2,vec1),它给出了8 4。仅返回第一个匹配项。如果 vec1 是唯一的,这将起作用。

理想情况下,我正在寻找这个结果:8 9 4 5。 cherry 首先在 pos 8 和 9 匹配,然后 apple 在 4 和 5 匹配。

有没有不使用循环的聪明方法来做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试这个

    unlist(lapply(vec2, function(x) which(vec1 %in% x)))
    [1] 8 9 4 5
    

    它将依次返回vec2中存在的vec1中的元素。

    【讨论】:

      【解决方案2】:

      which(!is.na(match(vec1,vec2)))[order(match(vec1,vec2)[!is.na(match(vec1,vec2))])]

      哇...可能有更简单的方法可以做到这一点,但是...

      > match(vec1,vec2)
      [1] NA NA NA  2  2 NA NA  1  1
      

      好的,所以通过反转匹配,我可以使用which() 来获取它不是 NA 的索引

      > which(!is.na(match(vec1,vec2)))
      [1] 4 5 8 9
      

      这会得到你想要的索引,但不是你想要的顺序。因此,如果我们在match() 向量上使用order,它将让我重新排序到所需的值。在这里,我再次匹配,只保留非 NA 值。

      > order(match(vec1,vec2)[!is.na(match(vec1,vec2))])
      [1] 3 4 1 2
      

      通过这个子排序,你会得到:

      > which(!is.na(match(vec1,vec2)))[order(match(vec1,vec2)[!is.na(match(vec1,vec2))])]
      [1] 8 9 4 5
      

      如果这很慢,请先保存匹配语句,不要一遍又一遍地执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-14
        • 2016-03-23
        • 2018-06-21
        • 2018-04-20
        相关资源
        最近更新 更多