+1 za przypomnienie nam o Reducei poprawne użycie wielkich liter w R.
mariotomo
8
Warto zauważyć, że dotyczy intersectto operacji na zbiorach. Jeśli masz elementy powtarzające się w wektorach, utracisz tę informację, ponieważ wektory zostaną zamienione w zbiory przed przecięciem. Np intersect(c(1,1,2,3), c(1,1,3,4))spowodowałoby c(1,3), a może nie chciał wynik c(1,1,3).
Giora Simchoni
1
@GioraSimchoni, jak możesz uzyskać c (1,1,3), jeśli naprawdę tego chcesz?
StatsSorceress
@StatsSorceress Załóżmy, że chcesz "przecięcie zachowujące duplikaty" wektorów składających się z dodatnich liczb całkowitych, wszystkie na liście L. Następujący kod działa: 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])))Innym sposobem na zrobienie tego byłoby użycie matchfunkcji wraz z ujemnym indeksowaniem do iteracyjnego usuwania z każdego z wektorów każdy element dodany do "jądra".
Montgomery Clift
24
To już dobra odpowiedź, ale można to zrobić na kilka innych sposobów:
c
jako nazwy zmiennej ...c(1,2...)
.Odpowiedzi:
Może istnieć sprytniejszy sposób, aby to zrobić, ale
wykona robotę.
EDYCJA: Sprytniej i wygodniej, jeśli masz dużo argumentów:
źródło
Reduce
i poprawne użycie wielkich liter w R.intersect
to operacji na zbiorach. Jeśli masz elementy powtarzające się w wektorach, utracisz tę informację, ponieważ wektory zostaną zamienione w zbiory przed przecięciem. Npintersect(c(1,1,2,3), c(1,1,3,4))
spowodowałobyc(1,3)
, a może nie chciał wynikc(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])))
Innym sposobem na zrobienie tego byłoby użyciematch
funkcji wraz z ujemnym indeksowaniem do iteracyjnego usuwania z każdego z wektorów każdy element dodany do "jądra".To już dobra odpowiedź, ale można to zrobić na kilka innych sposobów:
lub,
Można oczywiście pominąć
unique
połączeń, jeśli wiesz, że nie ma powtarzających się wartości ciągua
,b
lubc
.źródło
UPDATE EDIT Prostszy kod
źródło