R:使用另一个数据表的值更新数据表中的NA

时间:2015-11-29 10:36:03

标签: r merge data.table 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)) 

在数据表DT2中,列P中的所有NAs都应根据数据表P0中的值DT1进行更新。

如果DT2ID排序DT1,则可以解决问题:

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

但是如何在不排序DT2之前“合并”数据表?

2 个答案:

答案 0 :(得分:4)

这是按条件

加入的另一种选择
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

答案 1 :(得分:2)

我们可以加入两个数据集on'ID',对于'P'中的NA值,我们将'P'指定为'P0',然后通过将其指定为'NULL'来删除'P0'

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

或者@DavidArenburg提到,我们可以在加入'ID'后使用ifelse条件来替换'P'中的NA元素。

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