Treat NA as zero only when adding a number

data.table, na, r

Solution

You can define your own function to act as you want

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]

Problem

When calculating the sum of two data tables, `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 ``` I don't want to substitute all NA's with 0. What I want is `NA+NA=NA` and `NA+n=n` to get the following result: ``` Name 1 2 1: Joe 0 5 2: Ann NA 3 ``` How is this done in R? UPDATE: removed typo in dt1

Original source

Related problems