2015-07-16 18 views
5

Ho un frame di dati con alcuni valori NA. Ho bisogno della somma di due colonne. Se un valore è NA, devo trattarlo come zero.Somma di due colonne di frame dati con valori NA

a b c d 
1 2 3 4 
5 NA 7 8 

Colonna e dovrebbe essere la somma di B e C:

e 
5 
7 

Ho provato un sacco di cose, e fatto due dozzine di ricerche senza fortuna. Sembra un problema semplice. Qualsiasi aiuto sarebbe apprezzato!

+0

Se NA deve essere trattato come 0, perché non trasformarli in 0 e quindi eseguire l'operazione? – erasmortg

risposta

10
dat$e <- rowSums(dat[,c("b", "c")], na.rm=TRUE) 
dat 
# a b c d e 
# 1 1 2 3 4 5 
# 2 5 NA 7 8 7 
+0

Grazie! Sapevo che doveva esserci una soluzione semplice. Ho continuato a provare ad applicare la funzione somma per riga, senza fortuna. – StatDance

+0

Puoi farlo facilmente anche con 'apply', anche se' rowSums' è vettorizzato. A proposito, la migliore prestazione sarà ottenuta convertendo esplicitamente in matrice, come 'rowSums (as.matrix ...'. –

+0

Ciao, sto cercando di espandere questa risposta a un elenco di frame di dati. (dat, function (x) x $ e <- rowSums (x [, c ("b", "c", "d")], na.rm = T)) e dat $ e <- lapply (dat, function (x) rowSums (x [, c ("b", "c", "d")], na.rm = T)) senza successo Hai un'idea? Grazie –

1

Ecco un'altra soluzione, con concatenati ifelse():

dat$e <- ifelse(is.na(dat$b) & is.na(dat$c), dat$e <-0, ifelse(is.na(dat$b), dat$e <- 0 + dat$c, dat$b + dat$c)) 
# a b c d e 
#1 1 2 3 4 5 
#2 5 NA 7 8 7 

Edit, qui è un'altra soluzione che utilizza with come suggerito da @kasterma nei commenti, questo è molto più leggibile e lineare :

dat$e <- with(dat, ifelse(is.na(b) & is.na(c), 0, ifelse(is.na(b), 0 + c, b + c))) 
+1

Posto perfetto dove 'with' sarà migliorare le cose: 'dat $ e <- con (dat, ifelse (is.na (b) & is.na (c), 0, ifelse (is.na (b), 0 + c, b + c))) ' – kasterma

+0

Sono d'accordo, molto più leggibile! Ho modificato la risposta anche con la tua soluzione, se questo è ok – erasmortg

+0

completamente bene @erasmortg – kasterma

Problemi correlati