这里我有两个字符串向量,其顺序很重要,无法更改。
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号匹配。
有没有一种聪明的方法可以在不诉诸循环的情况下做到这一点?
答案 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
如果这很慢,请先保存匹配语句,不要一遍又一遍。