Birden fazla vektörden ortak elementler nasıl bulunur?


159

Herkes bana birden çok vektörden ortak öğeleri nasıl bulacağımı söyleyebilir mi?

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

Yukarıdaki vektörlerden ortak öğeleri almak istiyorum (ör: 3 ve 9)


45
cDeğişken adı olarak kullanmak iyi bir fikir değil ...
Marek

4
neden diğerleri gibi bir mektup?
Mostafa

12
@DimitriPetrenko çünkü listeleri ile bildirebilirsiniz c(1,2...).
Mathias711

Yanıtlar:


333

Bununla ilgili daha akıllıca bir yol olabilir, ama

intersect(intersect(a,b),c)

işi yapacak.

DÜZENLEME: Daha zekice ve daha fazla argümanınız varsa daha rahat:

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

16
Bize hatırlatmak için +1 Reduceve doğru R büyük harf kullanımı!
mariotomo

8
intersectBelirlenmiş işlemler için olduğunu belirtmek gerekir . Vektörlerde yinelenen öğeler varsa, vektörler kesişmeden önce kümelere dönüştürüldüğü için bu bilgileri kaybedersiniz. Örneğin intersect(c(1,1,2,3), c(1,1,3,4))sonuçlanır c(1,3)ve siz de sonucu isteyebilirsiniz c(1,1,3).
Giora Simchoni

1
@GioraSimchoni gerçekten istediğin buysa c (1,1,3) 'i nasıl alabilirsin?
İstatistikler

@StatsSorceress Pozitif tamsayılardan oluşan ve L listesindeki vektörlerin "kesişimi koruyan kopyalarını" istediğinizi varsayalım. Aşağıdaki kod işe 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])))yarar : Bunu yapmanın başka bir yolu, matchfonksiyonu her bir vektörden yinelemeli olarak kaldırmak için negatif abonelikle birlikte kullanır her eleman "çekirdeğe" eklendi.
Montgomery Clift

24

Şimdiden iyi bir cevap, ancak bunu yapmanın birkaç yolu daha var:

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

veya,

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

Belli ki atlayabilirsiniz uniquehiçbir tekrarlanan değerler dahilinde olduğunu biliyoruz eğer aramaları a, bya da c.


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)

GÜNCELLEME DÜZENLEME Daha basit bir kod

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

intersect_all(a,b,c)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.