2011-07-08 29 views
9

Zanim odkryję ponownie koło: czy istnieje funkcja w R, która otrzymuje listę x i zwraca listę y taką, że y[[i]] = intersect(x[[1]][[i]], x[[2]][[i]], ...)? Jeśli nie, czy istnieje sposób R-adic do kodowania go w kilku liniach?Przecięcie list w R

Odpowiedz

9

Czy to działa?

x <- list(list(1:3,2:4),list(2:3,4:5),list(3:7,4:5)) 
maxlen <- max(sapply(x,length)) 
lapply(seq(maxlen),function(i) Reduce(intersect,lapply(x,"[[",i))) 

(intersect trwa tylko dwa argumenty, więc trzeba użyć Reduce jako dodatkowy etap)

PS Nie próbowałem tego na wszelkich twardych przypadkach - na przykład listy nierównej długości.

+0

Jest to całkiem ładny iw duchu R. – gappy

2

Wydaje się Reduce można po prostu stosować w następujący sposób:

> Reduce(intersect, list(v1 = c("a","b","c","d"), 
+       v2 = c("a","b","e"), 
+       v3 = c("a","f","g"))) 
[1] "a"