2011-07-08 60 views
9

Antes de redescubrir la rueda: ¿hay una función en R que recibe una lista x y devuelve una lista y tal que y[[i]] = intersect(x[[1]][[i]], x[[2]][[i]], ...)? Si no, ¿hay una forma R-adic de codificarlo en un par de líneas?Intersección de listas en R

Respuesta

9

¿Funciona?

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 sólo toma dos argumentos por lo que tiene que utilizar Reduce como un paso adicional)

PS No he probado esto en todos los casos difíciles - por ejemplo, listas de longitud desigual.

+0

Esto es bastante agradable y en el espíritu R. – gappy

2

Parece que la Reduce puede usarse simplemente como sigue:

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