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.