2012-03-23 12 views
5

dati falsi per l'illustrazione:R: Come posso riassumere tutto variabili, all'interno di casi, mentre il conteggio NA pari a zero

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

Questo mi avrebbe ottenere la risposta che voglio, se non fosse per i valori NA:

Inoltre, ci sarebbe un modo ancora più elegante se mi interessasse solo, ad esempio variabili == 2?

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

Grazie mille!

+0

+1 per una buona domanda e un grande nome utente :) – Tommy

risposta

5

i seguenti lavori per il tuo esempio specifico, ma ho il sospetto che il vostro caso d'uso reale è più complicato:

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 

ma questo approccio generale dovrebbe funzionare. Per esempio, il secondo esempio potrebbe essere qualcosa di simile:

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

o più in generale si potrebbe permettere a te stesso di passare in una variabile per il confronto:

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

fantastico, questo fa tutto ciò di cui ho bisogno! –

2

Un altro modo è quello di sottrarre la tua vettore bersaglio da ogni riga del vostro data.frame, negare e poi fare 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

grazie per avermi mostrato un altro modo :) –

Problemi correlati