2012-03-23 14 views
5

datos falsos para la ilustración:R: ¿Cómo puedo resumir a través de las variables, dentro de los casos, mientras que cuenta NA cero

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

Esto me llevaría la respuesta que desea si no fuera por los valores de NA:

df$count <- with(df, (a==1) + (b==2) + (c==3)) 

Además, habría una manera aún más elegante si solo estuviera interesado, por ejemplo variables == 2?

df$count <- with(df, (a==2) + (b==2) + (c==2)) 

¡Muchas gracias!

+0

+1 para una buena pregunta y un gran nombre de usuario :) – Tommy

Respuesta

5

las siguientes obras para su ejemplo específico, pero tengo la sospecha de que su caso de uso real es más complicado:

df$count <- apply(df,1,function(x){sum(x == 1:3,na.rm = TRUE)}) 
> df 
    a b c count 
1 1 2 NA  2 
2 2 2 2  1 
3 3 2 3  2 
4 4 2 4  1 
5 5 NA 5  0 

pero este enfoque general debería funcionar. Por ejemplo, su segundo ejemplo sería algo como esto:

df$count <- apply(df,1,function(x){sum(x == 2,na.rm = TRUE)}) 

o más generalmente se podía permitirse que pasan en una variable para la comparación:

df$count <- apply(df,1,function(x,compare){sum(x == compare,na.rm = TRUE)},compare = 1:3) 
+0

genial, esto hace todo lo que necesito! –

2

Otra forma consiste en restar el vector objetivo de cada fila de la hoja.de.datos, negar y luego hacer rowSums con na.rm=TRUE:

target <- 1:3 
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE) 
[1] 2 1 2 1 0 

target <- rep(2,3) 
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE) 
[1] 1 3 1 1 0 
+0

gracias por mostrarme de otra manera :) –

Cuestiones relacionadas