+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:
c
als Variablenname zu verwenden ...c(1,2...)
.Antworten:
Es könnte einen klügeren Weg geben, dies zu tun, aber
wird den Job machen.
EDIT: Klüger und bequemer, wenn Sie viele Argumente haben:
quelle
Reduce
und die korrekte R-Großschreibung!intersect
für festgelegte Operationen gilt. Wenn Elemente in den Vektoren wiederkehren, verlieren Sie diese Informationen, da die Vektoren vor dem Schneiden in Mengen umgewandelt werden. ZBintersect(c(1,1,2,3), c(1,1,3,4))
würde dazu führenc(1,3)
, und Sie könnten das Ergebnis gewollt habenc(1,1,3)
.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, diematch
Funktion zusammen mit der negativen Subskription zu verwenden, um iterativ aus jedem der Vektoren zu entfernen jedes Element, das dem "Kernel" hinzugefügt wurde.Eine gute Antwort bereits, aber es gibt noch einige andere Möglichkeiten, dies zu tun:
oder,
Sie können natürlich die weglassen
unique
Anrufe , wenn Sie wissen , dass es keine wiederholten Werte innerhalba
,b
oderc
.quelle
UPDATE EDIT Ein einfacher Code
quelle