2016-08-02 31 views
1

让我们DT1nansum在R代表data.table

开始
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 

我们也有DT2

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 
+1

您确定要将此数据存储为'data.table' /'data.frame'而不是矩阵吗? – MichaelChirico

+0

我使用data.table,因为我必须做一些沉重的操作,但我不介意使用矩阵的那部分。 – Alexis

+0

为什么重操作的结果不会产生“0”而不是“NA”? – MichaelChirico

回答

3

一种选择是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 
+1

不错。 'is.na(x)&is.na(y)'是我必须用来修正sum(NA,na.rm = TRUE)== 0'的同一种“管道胶带”...但不要以为我们可以解决这个问题。 – MichaelChirico

+1

与'cbind'和'rowSums'相似,可以使用'rbind'和'rowsum'(...这些函数名称不是很好......):'DT = rbind(DT1 [,r:= .I], DT2 [,r:= .I])[,rowsum(as.matrix(.SD),r,na.rm = TRUE)]'。但是,这会返回一个矩阵(这可能是OP应该处理的东西)。 – Frank