0

2 つのベクトルがあるとします。

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関数は、2 つのベクトルが一致する要素を含む場所のインデックスをリストしますが、本質的に反対の関数が必要です。2 つのベクトルの要素が一致しないインデックスを表示する関数が必要です。

# 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

誰もこれを行う方法を知っていますか? ありがとうございました

4

1 に答える 1

2

あなたは後ですintersect

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

yinの要素のインデックスが必要な場合は、 and (内部で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重複した要素を削除するため、回避されます) 。


x にない y の要素のインデックスが必要な場合は、前に!`%in% を付けるだけで論理ベクトルが返されます

which(!y%in%x)

##[1] 3 5 8

または、要素を使用する場合setdiff

setdiff(y,x)
## [1]  5  4 10
于 2012-11-08T04:27:37.770 に答える