如何找到两个向量之间的精确匹配?

3
我需要在两个向量之间找到匹配项:
y=c("13AD10","13AD11","13AD12","13AD13","13AD14","13AD16","13AD17","13AD19","13AD1","13AD20","13AD21","13AD24","13AD25","13AD2","13AD3","13AD5","13AD6","13AD7","13AD8","13AD9","13HD10","13HD11","13HD12","13HD14","13HD5","13HD7")
to_find=c("13AD1","13AD3","13AD7","13AD13","13AD20")

根据我在这个网站上找到的信息,我尝试了

select=grep(paste(to_find,collapse="|"),y)

这个查询返回了太多的条目(所有以13AD1开头的都在其中)。

[1]  1  2  3  4  5  6  7  8  9 10 15 18

我尝试了

select=which(y==to_find)

但不是所有条目都包含在内。

[1]  4 10 18

实际上,我遇到了这个问题

y==to_find
[1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
[21] FALSE FALSE FALSE FALSE FALSE FALSE

尽管例如


to_find[1]==y[9]

[1] TRUE

我很困惑,为什么y==to_find和to_find1==y[9]的结果不同?有什么办法可以精确匹配我的向量吗?谢谢你的帮助。
PS:这个问题在R中匹配两个向量中部分得到了回答,但该帖子没有解释grep和==的含义。
3个回答

5
如何呢:
to_find %in% y
# [1] TRUE TRUE TRUE TRUE TRUE

to_find[to_find %in% y]
# [1] "13AD1"  "13AD3"  "13AD7"  "13AD13" "13AD20"

grep(paste(to_find,collapse="|"),y)会给出“太多”的答案,因为例如13AD1将与13AD10匹配,因为前者完全包含在后者中。

which(y==to_find)会给出“太少”的答案,因为它只考虑成对的相等性(并且向量to_find被循环以匹配y的长度),所以只有当to_find[i] == y[i]时才会返回i


谢谢您的回答。实际上,这并不完全适用。我需要在"y"中找出"to_find"的位置。答案应该是[1] 4 9 10 15 18。 - Matarit
@matarit,从你的问题中并不清楚。下面jogo的回答会给你确切的答案。然而,我对于为什么你的方法不起作用的解释仍然适用。 - stas g
感谢@stas g的解释。 - Matarit
@Matarit 没问题 :) - stas g

4
这将给你yto_find元素的索引:
> match(to_find, y)
[1]  9 15 18  4 10

> match(c(to_find, "hallo"), y)
[1]  9 15 18  4 10 NA

您可以对结果进行排序:

> sort(match(c(to_find, "hallo"), y))
[1]  4  9 10 15 18

2
which(y %in% to_find)
# [1]  4  9 10 15 18
which(to_find %in% y)
# [1] 1 2 3 4 5

1
使用这种方法,不清楚to_find中的哪个索引对应哪个值(当然,如果OP不在意的话)。我认为下面的match(to_find, y)是更好的选择。 - stas g
@stasg 你是正确的。 - Ven Yao

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