假设我有两个向量:
x <- c(1,16,20,7,2)
y <- c(1, 7, 5,2,4,16,20,10)
我想删除y
中不在x
中的元素。也就是说,我想从5, 4, 10
删除元素y
。
y
[1] 1 7 2 16 20
最后,我希望向量x
和y
具有相同的元素。订单无关紧要。
我的想法:match
函数列出了两个向量包含匹配元素的位置的索引,但我需要一个函数,实际上是相反的。我需要一个函数来显示两个向量中的元素不匹配的索引。
# this lists the indices in y that match the elements in x
match(x,y)
[1] 1 6 7 2 4 # these are the indices that I want; I want to remove
# the other indices from y
有谁知道怎么做?谢谢
答案 0 :(得分:2)
您在intersect
intersect(x,y)
## [1] 1 16 20 7 2
如果您想要y
中x
元素的索引,请使用which
和%in%
(%in%
在内部使用match
,所以你在这里正确的方向)
which(y %in% x)
## [1] 1 2 4 6 7
正如@joran在评论intersect
中指出的那样会删除重复项,所以也许是一个安全的选项,如果你想返回真正的匹配就像是
intersection <- function(x,y){.which <- intersect(x,y)
.in <- x[which(x %in% y)]
.in}
x <- c(1,1,2,3,4)
y <- c(1,2,3,3)
intersection(x,y)
## [1] 1 1 2 3
# compare with
intersect(x,y)
## [1] 1 2 3
intersection(y,x)
## [1] 1 2 3 3
# compare with
intersect(y, x)
## [1] 1 2 3
然后你需要注意使用这个修改过的函数进行排序(intersect
避免使用它,因为它会丢弃重复的元素)
如果你想要y的那些元素的索引不在x中,只需用!
作为前缀,因为'%in%返回一个逻辑向量
which(!y%in%x)
##[1] 3 5 8
或者,如果您希望元素使用setdiff
setdiff(y,x)
## [1] 5 4 10