Bagaimana menemukan elemen umum dari banyak vektor?

159

Adakah yang bisa memberi tahu saya cara menemukan elemen umum dari beberapa vektor?

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

Saya ingin mendapatkan elemen umum dari vektor di atas (mis: 3 dan 9)

Chares
sumber
45
Itu bukan ide yang baik untuk digunakan csebagai nama variabel ...
Marek
4
mengapa surat itu seperti orang lain?
Mostafa
12
@ DimitriPetrenko karena Anda dapat mendeklarasikan daftar c(1,2...).
Mathias711

Jawaban:

333

Mungkin ada cara yang lebih pintar untuk melakukan hal ini, tetapi

intersect(intersect(a,b),c)

akan melakukan pekerjaan.

EDIT: Lebih cerdik, dan lebih nyaman jika Anda memiliki banyak argumen:

Reduce(intersect, list(a,b,c))
bnaul
sumber
16
+1 untuk mengingatkan kami tentang Reducedan kapitalisasi R yang benar!
mariotomo
8
Perlu dicatat bahwa intersectuntuk operasi yang ditetapkan. Jika Anda memiliki elemen berulang di vektor, Anda akan kehilangan info ini karena vektor diubah menjadi set sebelum berpotongan. Misalnya intersect(c(1,1,2,3), c(1,1,3,4))akan menghasilkan c(1,3), dan Anda mungkin menginginkan hasilnya c(1,1,3).
Giora Simchoni
1
@GioraSimchoni bagaimana Anda bisa mendapatkan c (1,1,3), jika itu yang Anda inginkan?
StatsSorceress
@StatsSorceress Misalkan Anda menginginkan "intersection preservate duplikate" dari vektor yang terdiri dari bilangan bulat positif, semuanya ada dalam daftar L. Kode berikut berfungsi: 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])))Cara lain untuk melakukan ini akan menggunakan matchfungsi bersama dengan subskrip negatif untuk secara iteratif menghapus dari masing-masing vektor setiap elemen ditambahkan ke "kernel".
Montgomery Clift
24

Jawaban yang bagus sudah, tetapi ada beberapa cara lain untuk melakukan ini:

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

atau,

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

Anda jelas dapat menghilangkan uniquepanggilan jika Anda tahu bahwa tidak ada nilai berulang di dalam a, batau c.

James
sumber
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)

EDIT UPDATE Kode yang lebih sederhana

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

intersect_all(a,b,c)
Abhishek K Baikady
sumber