nansum в R для data.table

Начнем с ДТ1.

library(data.table)
DT1 <- data.table(c(NA, NA, NA, NA, NA),
                  c(1, 1, 1, 1, NA),
                  c(1, 1, 1, 1, NA))
# 1: NA  1  1
# 2: NA  1  1
# 3: NA  1  1
# 4: NA  1  1
# 5: NA NA NA

У нас тоже есть ДТ2.

DT2 <- data.table(c(NA, NA, NA, NA, NA),
                  c(2, 2, 2, 2, 2),
                  c(2, 2, 2, 2, 2))
# 1: NA  2  2
# 2: NA  2  2
# 3: NA  2  2
# 4: NA  2  2
# 5: NA  2  2

Я хочу суммировать две таблицы data.table, чтобы получить следующий результат:

# 1: NA  3  3
# 2: NA  3  3
# 3: NA  3  3
# 4: NA  3  3
# 5: NA  2  2

person Alexis    schedule 02.08.2016    source источник
comment
Вы уверены, что хотите сохранить эти данные как data.table/data.frame, а не как матрицу?   -  person MichaelChirico    schedule 02.08.2016
comment
Я использую data.table, потому что раньше мне приходилось выполнять некоторые тяжелые операции, но я не возражаю против использования матрицы для этой части.   -  person Alexis    schedule 02.08.2016
comment
Почему в результате тяжелых операций не получается 0 вместо NA?   -  person MichaelChirico    schedule 02.08.2016
comment
В моем контексте 0 и NA должны быть разными, но когда я их объединяю, я должен использовать указанную выше сумму.   -  person Alexis    schedule 02.08.2016
comment
Разница между 0 и NA появится, когда я распечатаю data.table как CSV   -  person Alexis    schedule 02.08.2016
comment
Есть еще одна неприятная вещь: sum(rep(NA, 4), na.rm = TRUE) это 0. Я не знаю, как мы можем обойти это слияние без дополнительной проверки надежности ваших данных.   -  person MichaelChirico    schedule 02.08.2016


Ответы (1)


Один из вариантов Map

setDT(Map(function(x,y) {x1 <- rowSums(cbind(x,y), na.rm  = TRUE)
           x1[is.na(x) & is.na(y)] <- NA
            x1}, DT1, DT2))[]
#   V1 V2 V3
#1: NA  3  3
#2: NA  3  3
#3: NA  3  3
#4: NA  3  3
#5: NA  2  2
person akrun    schedule 02.08.2016
comment
Ницца. is.na(x) & is.na(y) — это та же клейкая лента, которую мне пришлось использовать, чтобы починить sum(NA, na.rm = TRUE) == 0... но не думаю, что мы действительно сможем обойти это. - person MichaelChirico; 02.08.2016
comment
Подобно cbind и rowSums, можно было бы rbind и rowsum (... эти имена функций не очень хороши...): DT = rbind(DT1[, r := .I], DT2[, r := .I])[, rowsum(as.matrix(.SD), r, na.rm = TRUE)]. Однако это возвращает матрицу (вероятно, с ней в любом случае должен работать ОП). - person Frank; 02.08.2016