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

6

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

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首先在位置8和9上匹配,然后apple在4和5上匹配。

有没有一种聪明的方法可以做到这一点,而不必使用循环?

2个回答

11

你可以尝试这个

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

它将依次返回vec1中与vec2相匹配的元素。


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

这将获取所需的索引,但不按所需顺序排列。因此,如果我们在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

如果速度很慢,先保存匹配语句以免重复执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接