Pregunta

¿Cómo puedo sumar el número de casos completos de dos columnas?

Con c igual a:

      a  b
[1,] NA NA
[2,]  1  1
[3,]  1  1
[4,] NA  1

Aplicando algo como

rollapply(c, 2, function(x) sum(complete.cases(x)),fill=NA)

Me gustaría recuperar un solo número, 2 en este caso.Esto será para un conjunto de datos grande con muchas columnas, por lo que me gustaría usar rollapply en todo el conjunto en lugar de simplemente hacer sum(complete.cases(a,b)).

¿Estoy pensando demasiado en ello?

¡Gracias!

¿Fue útil?

Solución

Puede calcular el número de casos completos en las columnas de la matriz vecina utilizando rollapply como este:

m <- matrix(c(NA,1,1,NA,1,1,1,1),ncol=4)
#     [,1] [,2] [,3] [,4]
#[1,]   NA    1    1    1
#[2,]    1   NA    1    1

library(zoo)

rowSums(rollapply(is.na(t(m)), 2, function(x) !any(x)))
#[1] 0 1 2

Otros consejos

Has probado sum(complete.cases(x))?!

set.seed(123)
x <- matrix( sample( c(NA,1:5) , 15 , TRUE ) , 5 )
#     [,1] [,2] [,3]
#[1,]    1   NA    5
#[2,]    4    3    2
#[3,]    2    5    4
#[4,]    5    3    3
#[5,]    5    2   NA


sum(complete.cases(x))
#[1] 3

para encontrar el complete.cases() de las dos primeras columnas:

sum(complete.cases(x[,1:2]))
#[1] 4

Y para apply a dos columnas de un matrix En toda la matriz, podrías hacer esto:

#  Bigger data for example
set.seed(123)
x <- matrix( sample( c(NA,1:5) , 50 , TRUE ) , 5 )
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]    1   NA    5    5    5    4    5    2   NA    NA
#[2,]    4    3    2    1    4    3    5    4    2     1
#[3,]    2    5    4   NA    3    3    4    1    2     2
#[4,]    5    3    3    1    5    1    4    1    2     1
#[5,]    5    2   NA    5    3   NA   NA    1   NA     5

# Column indices
id <- seq( 1 , ncol(x) , by = 2 )
[1] 1 3 5 7 9
apply( cbind(id,id+1) , 1 , function(i) sum(complete.cases(x[,c(i)])) )
[1] 4 3 4 4 3

complete.cases() funciona en filas en todo el data.frame o matrix regresando TRUE para aquellas filas a las que no les falta ningún dato.Un menor aparte, "c" es un mal nombre de variable porque c() es una de las funciones más utilizadas.

Esto debería funcionar para ambos. matrix y data.frame

> sum(apply(c, 1, function(x)all(!is.na(x))))

[1] 2

y simplemente podrías iterar a través de una matriz grande M

for (i in 1:(ncol(M)-1) ){
    c <- M[,c(i,i+1]
    agreement <- sum(apply(c, 1, function(x)all(!is.na(x))))
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top