2010-07-16 9 views
14

Tengo docenas de listas, cada una es una colección de 11 marcos de datos. Algunos marcos de datos están vacíos (otro script no generó ningún dato, ni un error).¿Cómo elimino marcos de datos vacíos de una lista?

Necesito presionar cada lista a través de una función pero que se bloquea cuando ve un marco de datos vacío. Entonces, ¿cómo escribo una función que tomará una lista, hará un dim en cada elemento (es decir, el marco de datos) y si es 0, luego saltará al siguiente.

que hemos probado algo como esto:

empties <- function (mlist) 
{ 
for(i in 1:length(mlist)) 
    { 
    if(dim(mlist[[i]])[1]!=0) return (mlist[[i]]) 
    } 
} 

Pero está claro, que no funcionó. Haría esto manualmente en este punto, pero eso llevaría una eternidad. ¿Ayuda?

Respuesta

16

No estoy seguro de si esto es exactamente lo que está pidiendo, pero si desea recortar mlist hacia abajo para contener solo los marcos de datos no vacíos antes de ejecutar la función en él, intente mlist[sapply(mlist, function(x) dim(x)[1]) > 0].

ej .:

R> M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2)) 
R> M2 <- data.frame(matrix(nrow = 0, ncol = 0)) 
R> M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2)) 
R> mlist <- list(M1, M2, M3) 
R> mlist[sapply(mlist, function(x) dim(x)[1]) > 0] 
[[1]] 
    X1 X2 
1 1 3 
2 2 4 

[[2]] 
    X1 X2 
1 9 11 
2 10 12 
+0

Exactamente lo que quería. ¡Muchas gracias! – Maiasaura

+0

También estaba usando lapply, que no me di cuenta, devuelve la misma longitud ... – Maiasaura

+0

¿Qué tal una lista anidada? ¿Tendría que repetirlo? – Bonono

11

Un enfoque ligeramente más simple y más transparente a la combinación sapply/indexación es utilizar la función de filtro():

> Filter(function(x) dim(x)[1] > 0, mlist) 
[[1]] 
    X1 X2 
1 1 3 
2 2 4 

[[2]] 
    X1 X2 
1 9 11 
2 10 12 
+0

¿Alguna idea sobre qué podría ser mejor? – TMOTTM

+0

@TMOTTM, deberían ser casi exactamente iguales, creo. (¡Pero pruébalo y avísanos si no!) – Harlan

+0

'nrow (x)> 0' en lugar de' dim (x) [1]> 0'. Menos es más – Tunn

Cuestiones relacionadas