Wie finde ich gemeinsame Elemente aus mehreren Vektoren?

159

Kann mir jemand sagen, wie man die gemeinsamen Elemente aus mehreren Vektoren findet?

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

Ich möchte die gemeinsamen Elemente aus den obigen Vektoren erhalten (Beispiel: 3 und 9).

Gebühren
quelle
45
Es ist keine gute Idee, cals Variablenname zu verwenden ...
Marek
4
Warum ist es ein Brief wie andere?
Mostafa
12
@DimitriPetrenko, weil Sie Listen mit deklarieren können c(1,2...).
Mathias711

Antworten:

333

Es könnte einen klügeren Weg geben, dies zu tun, aber

intersect(intersect(a,b),c)

wird den Job machen.

EDIT: Klüger und bequemer, wenn Sie viele Argumente haben:

Reduce(intersect, list(a,b,c))
bnaul
quelle
16
+1 für die Erinnerung Reduceund die korrekte R-Großschreibung!
Mariotomo
8
Es ist erwähnenswert, dass dies intersectfür festgelegte Operationen gilt. Wenn Elemente in den Vektoren wiederkehren, verlieren Sie diese Informationen, da die Vektoren vor dem Schneiden in Mengen umgewandelt werden. ZB intersect(c(1,1,2,3), c(1,1,3,4))würde dazu führen c(1,3), und Sie könnten das Ergebnis gewollt haben c(1,1,3).
Giora Simchoni
1
@GioraSimchoni wie könntest du c (1,1,3) bekommen, wenn das wirklich das ist, was du willst?
StatsSorceress
@StatsSorceress Angenommen, Sie möchten, dass die "überschneidungserhaltenden Duplikate" von Vektoren, die aus positiven Ganzzahlen bestehen, alle in einer Liste L enthalten sind. Der folgende Code funktioniert: 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])))Eine andere Möglichkeit besteht darin, die matchFunktion zusammen mit der negativen Subskription zu verwenden, um iterativ aus jedem der Vektoren zu entfernen jedes Element, das dem "Kernel" hinzugefügt wurde.
Montgomery Clift
24

Eine gute Antwort bereits, aber es gibt noch einige andere Möglichkeiten, dies zu tun:

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

oder,

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

Sie können natürlich die weglassen uniqueAnrufe , wenn Sie wissen , dass es keine wiederholten Werte innerhalb a, boder c.

James
quelle
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 Ein einfacher Code

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

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