2015-05-07 49 views
6

这里我有两个字符串向量,其顺序很重要,不能更改。与有序索引匹配的R矢量向量

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

我想看看在VEC 2的元素出现在VEC 1,如果有,在哪里(索引/位置)和以什么顺序。我试过which(vec1 %in% vec2),它给4 5 8 9。这些是正确的索引,但顺序错误。我试过match(vec2,vec1),它给出8 4。只返回第一个匹配。如果vec1是唯一的,这将工作。

理想情况下,我正在寻找此结果:8 9 4 5。 樱桃第一次在第8和第9位匹配,然后苹果在第4和第5位匹配。

有没有一种明智的方法可以做到这一点,而不诉诸于循环?

回答

11

你可以试试这个

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

将由一个陆续返回本VEC 1的元素VEC 2之一。

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 

OK,所以通过逆转的比赛中,我可以使用which()获得索引,其中,它的不适用不适用

> 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 

Subsort这个,你会得到:

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

如果这是缓慢的,先救匹配语句不一遍又一遍做。