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

R:使用另一个数据表的值更新数据表中的NAs,r,merge,data.table,na,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)) 但是,如何才能在没有排序的情况下“合并”数据表呢?我们可以在'ID'上连接两个数据集,对于'p'中的N

有两个结构如下的数据表:

 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)) 

但是,如何才能在没有排序的情况下“合并”数据表呢?

我们可以在'ID'上连接两个数据集
,对于'p'中的NA值,我们将'p'指定为'P0',然后通过将其指定为'NULL'来删除'P0'

library(data.table)#v1.9.6+
DT2[DT1, on='ID'][is.na(P), P:= P0][, P0:= NULL][]
或者正如@davidernburg提到的,我们可以在“ID”上加入后使用
ifelse
条件来替换“p”中的NA元素

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

这里有另一个按条件加入的选项

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

我理解,在每个
[]
中都做了什么。这是一种接二连三的操作吗?@kamath它类似于
dplyr
中的
%>%
。我们正在更新每个操作的结果数据集。您可以使用
ifelse
一步完成此操作,如
DT2[DT1,P:=ifelse(is.na(P),i.P0,P),on='ID']
@DavidArenburg是的,谢谢,但我不确定
ifelse
和data.table是否会混淆。@DavidArenburg谢谢,我已更新。我在想与赋值相比,
ifelse
的速度会慢一些。相关的
数据。表
回答如下:
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