ignora NA in sum riga dplyr

c’è un modo elegante per gestire NA come 0 (na.rm = TRUE) in dplyr?

data % mutate(sum = a + b + c) abc sum 1 4 7 12 2 NA 8 NA 3 5 9 17 4 6 NA NA but I like to get abc sum 1 4 7 12 2 NA 8 10 3 5 9 17 4 6 NA 10 

anche se so che questo non è il risultato desiderato in molti altri casi

Potresti usare questo:

 library(dplyr) data %>% #rowwise will make sure the sum operation will occur on each row rowwise() %>% #then a simple sum(..., na.rm=TRUE) is enough to result in what you need mutate(sum = sum(a,b,c, na.rm=TRUE)) 

Produzione:

 Source: local data frame [4 x 4] Groups:  abc sum (dbl) (dbl) (dbl) (dbl) 1 1 4 7 12 2 2 NA 8 10 3 3 5 9 17 4 4 6 NA 10 

Un’altra opzione:

 data %>% mutate(sum = rowSums(., na.rm = TRUE)) 

segno di riferimento

 library(microbenchmark) mbm <- microbenchmark( steven = data %>% mutate(sum = rowSums(., na.rm = TRUE)), lyz = data %>% rowwise() %>% mutate(sum = sum(a, b, c, na.rm=TRUE)), nar = apply(data, 1, sum, na.rm = TRUE), akrun = data %>% mutate_each(funs(replace(., which(is.na(.)), 0))) %>% mutate(sum=a+b+c), frank = data %>% mutate(sum = Reduce(function(x,y) x + replace(y, is.na(y), 0), ., init=rep(0, n()))), times = 10) 

inserisci la descrizione dell'immagine qui

 #Unit: milliseconds # expr min lq mean median uq max neval cld # steven 9.493812 9.558736 18.31476 10.10280 22.55230 65.15325 10 a # lyz 6791.690570 6836.243782 6978.29684 6915.16098 7138.67733 7321.61117 10 c # nar 702.537055 723.256808 799.79996 805.71028 849.43815 909.36413 10 b # akrun 11.372550 11.388473 28.49560 11.44698 20.21214 155.23165 10 a # frank 20.206747 20.695986 32.69899 21.12998 25.11939 118.14779 10 a 

Oppure possiamo replace NA con 0 e quindi usare il codice dell’OP

 data %>% mutate_each(funs(replace(., which(is.na(.)), 0))) %>% mutate(Sum= a+b+c) #or as @Frank mentioned #mutate(Sum = Reduce(`+`, .)) 

Sulla base dei benchmark che utilizzano i dati di Beaupré @Steven, sembra che sia anche efficiente.

Prova questo

 data$sum <- apply(data, 1, sum, na.rm = T) 

I data risultanti sono

 abc sum 1 1 4 7 12 2 2 NA 8 10 3 3 5 9 17 4 4 6 NA 10