2016-08-02 30 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