2013-02-24 10 views
7

Podczas obliczania sumy dwóch tabel danych, NA+n=NA.Traktuj NA jako zero tylko podczas dodawania numeru

> 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ę, aby zastąpić cały NA na 0. Co chcę jest NA+NA=NA i NA+n=n uzyskać następujący wynik:

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

Jak to zrobić w R?

UPDATE: usunięto błąd w DT1

+0

Jeśli połączysz się z poprzednim pytaniem, ludzie mogą lepiej zrozumieć, co masz nadzieję osiągnąć mplish i może zaoferować lepszą pomoc. http://stackoverflow.com/questions/15044342/sum-of-hybrid-data-frames-depending-on-multiple-conditions-in-r –

+0

Wyizolowałem problem tutaj. Drugie pytanie zostało teraz rozwiązane. –

Odpowiedz

10

Można zdefiniować własną funkcję do działania, 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] 
+0

(+1) schludny trik z 'x [0]'! I Zapamiętaj to następnym razem – Arun

+1

Możesz również użyć 'as (NA, class (x))', nie testowałem, aby zobaczyć, który byłby szybszy. – mnel

+0

@ R-obert, funkcja mnel tutaj jest świetna. ty możesz umieścić to w swoim poprzednim pytaniu, po prostu zamieniając 'sum' z' '' 'w dwóch liniach' DTsum <- ... 'i' sumD3D4 <- ... ' –

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

(obejmuje @ sugestią Arun za) na.rm=TRUE jest bardzo przydatna do zapamiętania

+0

Niestety, po prostu zdałem sobie sprawę, że da to "NA + NA = 0", co nie jest tym, czego potrzebujesz – alexwhan

+0

w żadnym momencie OP nie oblicza 'NA + NA' (biorąc pod uwagę' dt1' i 'dt2' są zdefiniowane (nie to, jak są pokazywane) ' – mnel

+0

@mnel naprawiono literówkę w pytaniu –

Powiązane problemy