2013-02-24 8 views
7

Quando si calcola la somma di due tabelle di dati, NA+n=NA.Tratta NA come zero solo quando si aggiunge un numero

> 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 

Non voglio sostituire tutte NA di con 0. Quello che voglio è NA+NA=NA e NA+n=n per ottenere il seguente risultato:

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

Come è questo fatto in R?

UPDATE: errore di battitura rimosso in dt1

+0

Se si collega alla domanda precedente, la gente può capire meglio cosa si spera di fare mplish e può offrire un aiuto migliore. http://stackoverflow.com/questions/15044342/sum-of-hybrid-data-frames-depending-on-multiple-conditions-in-r –

+0

Ho isolato il problema qui. L'altra domanda è ora risolta. –

risposta

10

È possibile definire la propria funzione di agire come si vuole

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) trucco accurato con 'x [0]'! I Lo ricorderò per la prossima volta: – Arun

+1

Puoi anche usare 'as (NA, classe (x))', non ho benchmark per vedere quale sarebbe più veloce – mnel

+0

@ R-obert, la funzione mnel qui è fantastica. tu puoi inserirlo nella tua domanda precedente, semplicemente sostituendo 'sum' con mnel 'plus' nelle due righe di' DTsum <- ... 'e' 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] 

(include @ suggerimento di Arun) na.rm=TRUE è molto utile ricordare

+0

Mi spiace, ho appena realizzato che questo fornirà 'NA + NA = 0', che non penso sia quello che vuoi – alexwhan

+0

in nessun punto l'OP calcola' NA + NA' (dato il modo 'dt1' e' dt2' sono definiti (non come vengono mostrati) ' – mnel

+0

@mnel ha corretto un refuso nella domanda –