2013-02-24 14 views
7

Wenn Sie die Summe zweier Datentabellen berechnen, NA+n=NA.Behandeln Sie NA nur dann als Null, wenn Sie eine Zahl hinzufügen

> 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 

Ich will nicht alle NA mit 0 ersetzen Was ich will, ist NA+NA=NA und NA+n=n das folgende Ergebnis zu erhalten:

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

Wie dies in R getan wird?

UPDATE: entfernt Tippfehler in DT1

+0

Wenn Sie zurück zu Ihrer vorherigen Frage verknüpfen, können die Leute besser verstehen, was Sie hoffen zu akkumulieren mplish und kann bessere Hilfe anbieten. http://stackoverflow.com/questions/15044342/sum-of-hybrid-data-frames-depending-on-multiple-conditions-in-r –

+0

Ich habe das Problem hier isoliert. Die andere Frage ist jetzt gelöst. –

Antwort

10

Sie können festlegen, eine eigene Funktion zu handeln, wie Sie wollen

zu erinnern
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) ordentlicher Trick mit 'x [0]'! Erinnerst du dich an das nächste Mal? – Arun

+1

Du könntest auch 'as (NA, Klasse (x))' 'verwenden, ich habe keinen Benchmark erstellt, um zu sehen, welches schneller wäre – mnel

+0

@R-obert, mnels Funktion ist großartig. Sie kann es direkt in deine vorherige Frage einfügen, einfach "sum" durch mnels "plus" in den zwei Zeilen von 'DTsum <- ...' und '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] 

(enthält @ Vorschlag Arun) na.rm=TRUE sehr nützlich ist

+0

Tut mir leid, ich habe gerade festgestellt, dass dies 'NA + NA = 0' ergibt, was ich nicht glaube, was Sie wollen – alexwhan

+0

zu keinem Zeitpunkt berechnet das OP 'NA + NA' (gegeben durch' dt1' und 'dt2' sind definiert (nicht wie sie gezeigt werden) ' – mnel

+0

@Mnel einen Tippfehler in der Frage –