2015-05-07 48 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 

如果這是緩慢的,先救匹配語句不一遍又一遍做。