如何选择和删除特定元素或在向量或矩阵中找到它们的索引?

时间:2012-11-08 04:24:27

标签: r vector matrix indices

假设我有两个向量:

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 

最后,我希望向量xy具有相同的元素。订单无关紧要。

我的想法: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

有谁知道怎么做?谢谢

1 个答案:

答案 0 :(得分:2)

您在intersect

之后
intersect(x,y)
## [1]  1 16 20  7  2

如果您想要yx元素的索引,请使用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