R向量 - 向量匹配有序索引

时间:2015-05-07 12:37:47

标签: r

这里我有两个字符串向量,其顺序很重要,无法更改。

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

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

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

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

有没有一种聪明的方法可以在不诉诸循环的情况下做到这一点?

2 个答案:

答案 0 :(得分:11)

你可以试试这个

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

将逐一返回vec2中存在的vec1中的元素。

答案 1 :(得分:1)

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

这会获得您想要的索引,但不是您想要的顺序。因此,如果我们在order向量上使用match(),则可以让我重新排序到所需的值。在这里,我再次匹配,并且只保留非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

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