我需要找到两个向量之间的匹配:
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_find 1 == y [9]的不同结果?关于如何获得我的向量之间的完全匹配的任何想法?谢谢你的帮助。
PS:问题已部分回答Matching up two vectors in R,但该帖子未包含有关grep和==
的说明答案 0 :(得分: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
的长度),因此i
将仅在to_find[i] == y[i]
时返回。
答案 1 :(得分:4)
这将为您提供to_find
中y
元素的索引:
> 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 :(得分:2)
which(y %in% to_find)
# [1] 4 9 10 15 18
which(to_find %in% y)
# [1] 1 2 3 4 5