複数のベクターから共通の要素を見つける方法は?


159

複数のベクターから共通の要素を見つける方法を誰かに教えてもらえますか?

a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)

上記のベクトルから共通の要素を取得したい(例:3および9)


45
c変数名として使用することはお勧めしません...
Marek

4
なぜそれは他の人のような手紙ですか?
モスタファ2016年

12
@DimitriPetrenkoは、でリストを宣言できるためですc(1,2...)
Mathias711

回答:


333

これについては賢い方法があるかもしれませんが、

intersect(intersect(a,b),c)

仕事をします。

編集:あなたが多くの議論を持っているなら、より賢く、そしてより便利です:

Reduce(intersect, list(a,b,c))

16
を思い出させるための+1 Reduceと正しいR大文字化!
mariotomo

8
これはintersect集合演算のためのものであることに注意する価値があります。ベクター内で繰り返し発生する要素がある場合、ベクターは交差する前にセットに変換されるため、この情報は失われます。たとえば、intersect(c(1,1,2,3), c(1,1,3,4))結果はc(1,3)であり、あなたは結果を望んでいたかもしれませんc(1,1,3)
Giora Simchoni 2016年

1
@GioraSimchoni c(1,1,3)を取得するにはどうすればよいですか?
StatsSorceress

@StatsSorceressすべてがリストLにある正の整数で構成されるベクトルの「交差を維持する重複」が必要だとします。次のコードN <- max(unlist(L)); LT <- lapply(L, tabulate, nbins = N); v <- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x])))match機能します。これを行う別の方法は、負の添え字とともに関数を使用して、各ベクトルから反復的に削除することです。 「カーネル」に追加されたすべての要素。
モンゴメリークリフト

24

すでに良い答えですが、これを行う方法は他にもいくつかあります。

unique(c[c%in%a[a%in%b]])

または、

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]

またはuniqueaに繰り返し値がないことがわかっている場合は、呼び出しを省略できます。bc


7
intersect_all <- function(a,b,...){
  all_data <- c(a,b,...)
  require(plyr)
  count_data<- length(list(a,b,...))
  freq_dist <- count(all_data)
  intersect_data <- freq_dist[which(freq_dist$freq==count_data),"x"]
  intersect_data
}


intersect_all(a,b,c)

UPDATE EDITよりシンプルなコード

intersect_all <- function(a,b,...){
  Reduce(intersect, list(a,b,...))
}

intersect_all(a,b,c)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.