2009-01-24 21 views
10

que tengo un archivo CSV de archivo de los datos que puedo cargar en I usando read.csv()Filtrado de datos en R

Algunos de los datos faltan, por lo que quieren reducir la trama de datos hacia abajo para establecer que consiste en su totalidad de la no -faltando datos, es decir, si aparece un NULL en cualquier lugar, quiero excluir esa columna y fila del conjunto de datos filtrados.

Sé que probablemente pueda hacer esto de forma bastante simple con las operaciones integradas del vector R, pero no estoy muy seguro de cómo hacer esto exactamente?

Para hacer mi pregunta un poco más concreta, aquí hay una muestra rápida de los datos para que pueda ver lo que quiero hacer.

DocID  Anno1 Anno7 Anno8 
1   7  NULL 8 
2   8  NULL 3 
44   10  2  3 
45   6  6  6 
46   1  3  4 
49   3  8  5 
62   4  NULL 9 
63   2  NULL 4 
67   11  NULL 3 
91   NULL  9  7 
92   NULL  7  5 
93   NULL  8  8 

Así que dada esta entrada, necesito algo de código que reducirá la salida a esto.

DocID  Anno8 
44   3 
45   6 
46   4 
49   5 

Como Anno8 es la única columna con datos no NULL, y sólo hay cuatro filas con datos no nulos.

Respuesta

7

Si x es su data.frame (o matrix) entonces

x[ ,apply(x, 2, function(z) !any(is.na(z)))] 

Debido a que su ejemplo se utiliza NULL, is.na(·) será reemplazado por is.null(·)

Alternativamente se puede ver en subset(·).

+0

Gracias @rguha, esto es útil. ¿Cómo funcionaría esto si quisiera deshacerme, en una columna específica de la csv, de cualquier valor que sea inferior a, digamos, 5? – Rodolphe

19

Puede colocar cualquier fila que contenga una falta usando na.omit(), sin embargo, eso no es lo que quiere. Además, la respuesta actualmente aceptada es incorrecta. Le da columnas completas, pero no descarta las filas que tienen uno o más valores perdidos, que es lo que se solicitó. La respuesta correcta puede obtenerse como:

> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4)) 
> a 
    a b c 
1 1 NA 3 
2 2 1 4 
> na.omit(a)[,colSums(is.na(a))==0] 
    a c 
2 2 4 

ver que la respuesta anterior es erróneo:

> a[ ,apply(a, 2, function(z) !any(is.na(z)))] 
    a c 
1 1 3 
2 2 4 

Fila 1 la dejará caer debido a la NA en la columna 2.

2
a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1)) 

na.omit(a) 
    a b c 
2 2 1 4 
4 1 1 1 

a[rowSums(is.na(a))==0,] 
    a b c 
2 2 1 4 
4 1 1 1 

a[complete.cases(a),] 
    a b c 
2 2 1 4 
4 1 1 1 
+3

No entiendo esta respuesta. Esto siempre devolverá solo una fila –

+1

Solucionado ahora, gracias –