2011-02-13 10 views
21

Decir que tengo la siguiente R hoja.de.datosZZZ:Contando no NA en un marco de datos; obtener respuesta como un vector

(ZZZ <- structure(list(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 
8)), .Names = c("n", "m", "o"), row.names = c(NA, -3L), class = "data.frame")) 

## not run 
    n m o 
1 1 6 7 
2 2 NA 8 
3 NA NA 8 

Quiero saber, en forma de un vector, el número de no-nas que tengo. Quiero la respuesta a mi disposición como:

2, 1, 3 

Cuando utilizo el comando length(ZZZ), consigo 3, que por supuesto es el número de vectores en el hoja.de.datos, una pieza lo suficientemente valiosa de información.

Tengo otras funciones que operan en este data.frame y me dan respuestas en forma de vectores, pero, dang-it, la longitud no funciona así.

Respuesta

29

Prueba esto:

# define "demo" dataset 
ZZZ <- data.frame(n=c(1,2,NA),m=c(6,NA,NA),o=c(7,8,8)) 
# apply the counting function per columns 
apply(ZZZ, 2, function(x) length(which(!is.na(x)))) 

Después de dirigir:

> apply(ZZZ, 2, function(x) length(which(!is.na(x)))) 
n m o 
2 1 3 

Si realmente insiste en devolver un vector, es posible utilizar as.vector, por ejemplo, mediante la definición de esta función:

nonNAs <- function(x) { 
    as.vector(apply(x, 2, function(x) length(which(!is.na(x))))) 
    } 

Simplemente podría funcionar nonNAs(ZZZ):

> nonNAs(ZZZ) 
[1] 2 1 3 
1

Si sólo desea la suma total de AN en general, a continuación, suma() con is.na() lo hará :

ZZZ <- data.frame(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 8)) 
sum(!is.na(ZZZ)) 
+0

creo que la OP es después del número de NA ** por columna ** en el marco de datos no en general. – daroczig

+0

Buen punto. No leí con cuidado. – kmm

+0

Gracias por la ayuda de todos en esto. Responde mi pregunta Solo estoy empezando a abrir la puerta para ver lo que R puede hacer. Es realmente una herramienta increíble. – Plsvn

63
colSums(!is.na(x)) 

Vectorización ftw.

+10

Podría estar en su lugar (basado en OP): 'colSums (! Is.na (x))' Pero de todos modos: +1 va a su agradable soultion. – daroczig

+0

En mi humilde opinión, su solución debería ser la preferida – Taka

5

Para conseguir total de ninguno de los valores que faltan utilizan suma (is.na (x)) y para uso colSums colum-Wise (is.na (x)), donde x es varible conjunto de datos que contienen

Cuestiones relacionadas