/ / Traktuj NA jako zero tylko wtedy, gdy dodajesz liczbę - r, data.table, na

Traktuj NA jako zero tylko podczas dodawania liczby - r, data.table, na

Przy obliczaniu sumy dwóch tabel danych NA+n=NA.

> dt1 <- data.table(Name=c("Joe","Ann"), "1"=c(0,NA), "2"=c(3,NA))
> dt1
Name  1  2
1:  Joe  0  3
2:  Ann NA NA
> dt2 <- data.table(Name=c("Joe","Ann"), "1"=c(0,NA), "2"=c(2,3))
> dt2
Name  1 2
1:  Joe  0 2
2:  Ann NA 3
> dtsum  <- rbind(dt1, dt2)[, lapply(.SD, sum), by=Name]
> dtsum
Name  1  2
1:  Joe  0  5
2:  Ann NA NA

Nie chcę zamieniać wszystkich NA na 0. Chcę tego NA+NA=NA i NA+n=n aby uzyskać następujący wynik:

   Name  1  2
1:  Joe  0  5
2:  Ann NA  3

Jak to zrobić w R?

UPDATE: usunięto literówkę w dt1

Odpowiedzi:

10 dla odpowiedzi № 1

Możesz zdefiniować własną funkcję, aby działać tak, jak chcesz

plus <- function(x) {
if(all(is.na(x))){
c(x[0],NA)} else {
sum(x,na.rm = TRUE)}
}


rbind(dt1, dt2)[,lapply(.SD, plus), by = Name]

4 dla odpowiedzi nr 2
dtsum  <- rbind(dt1, dt2)[, lapply(.SD, function(x) ifelse(all(is.na(x)), as.numeric(NA), sum(x, na.rm=T))), by=Name]

(zawiera sugestię @Arun) na.rm=TRUE jest bardzo przydatny do zapamiętania