Czy ktoś może mi powiedzieć, jak znaleźć wspólne elementy z wielu wektorów?Jak znaleźć wspólne elementy z wielu wektorów?
a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)
Chcę dostać wspólne elementy z powyższych wektorów (EX: 3 i 9)
Czy ktoś może mi powiedzieć, jak znaleźć wspólne elementy z wielu wektorów?Jak znaleźć wspólne elementy z wielu wektorów?
a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)
Chcę dostać wspólne elementy z powyższych wektorów (EX: 3 i 9)
Nie może być mądrzejszy sposób, aby przejść na ten temat, ale
intersect(intersect(a,b),c)
zrobi Praca.
EDIT: Więcej sprytnie i wygodniej, jeśli masz dużo argumentów:
Reduce(intersect, list(a,b,c))
+1 za przypomnienie nam o 'Zmniejszeniu' i poprawnej kapitalizacji R! – mariotomo
Warto zauważyć, że 'przecięcie' służy do operacji ustawionych. Jeśli masz elementy powtarzające się w wektorach, utracisz te informacje, ponieważ wektory są przekształcane w zbiory przed przecięciem. Na przykład. 'przecięcie (c (1,1,2,3), c (1,1,3,4))" spowodowałoby 'c (1,3)', a mógłbyś chcieć wyniku 'c (1, 1,3) ". –
dobra odpowiedź już, ale istnieje kilka innych sposobów, aby to zrobić:
unique(c[c%in%a[a%in%b]])
lub
tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]
można oczywiście pominąć połączeń unique
jeśli wiesz, że nie ma wielokrotne wartości w zakresie a
, b
lub c
.
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 Prostszy kod
intersect_all <- function(a,b,...){
Reduce(intersect, list(a,b,...))
}
intersect_all(a,b,c)
To nie jest dobry pomysł, aby użyć 'C' jako nazwy zmiennej ... – Marek
dlaczego to pismo jak inni? –
@DimitriPetrenko, ponieważ możesz zadeklarować listy z 'c (1,2 ...)'. – Mathias711