2015-11-29 44 views
1

有以下結構的兩個數據表:R:在數據表中更新的NA與另一個數據表的值

DT1 <- data.table(ID=c("A","B","C"), P0=c(1,10,100), key="ID") 
DT2 <- data.table(ID=c("B","B","B","A","A","A","C","C","C"), t=rep(seq(0:2),3), P=c(NA,30,50,NA,4,6,NA,200,700)) 

在數據表DT2P列中的所有NAS應該由值P0出被更新的數據表DT1

如果DT2IDDT1有序,問題就可以解決這樣的:

setorder(DT2,ID) 
idxr <- which(DT2[["t"]]==1) 
set(DT2, i=idxr, j="P", value=DT1[["P0"]]) 

但數據表怎麼可以「合併」之前沒有訂購DT2

回答

2

我們可以加入兩個數據集on「ID」,爲NA值「P」,我們給「P」爲「P0」,然後將其分配到「NULL」刪除「P0」。

library(data.table)#v1.9.6+ 
DT2[DT1, on='ID'][is.na(P), P:= P0][, P0:= NULL][] 

或者正如@DavidArenburg提到的,我們可以使用ifelse條件加入關於「ID」後,以取代在「P」的NA元素。

DT2[DT1, P := ifelse(is.na(P), i.P0, P), on = 'ID'] 
+0

我明白了,什麼是每個'[]'做加盟的另一種選擇。這是一種又一種手術嗎? – kamath

+0

@kamath與'dplyr'中的'%>%'類似。我們正在更新每個操作的結果數據集。 – akrun

+1

你可以在'DT2 [DT1,P:= ifelse(is.na(P),i.P0,P),on ='ID']'' –

2

這裏是由條件

DT2[is.na(P), P := DT1[.SD, P0]] 
DT2 
# ID t P 
# 1: B 1 10 
# 2: B 2 30 
# 3: B 3 50 
# 4: A 1 1 
# 5: A 2 4 
# 6: A 3 6 
# 7: C 1 100 
# 8: C 2 200 
# 9: C 3 700 
相關問題