2015-11-29 26 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 
相关问题