有两个具有以下结构的数据表:
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
,列中的所有NAP
均应通过P0
数据表中的值进行更新DT1
。
如果DT2
按ID
like排序DT1
,问题可以这样解决:
setorder(DT2,ID)
idxr <- which(DT2[["t"]]==1)
set(DT2, i=idxr, j="P", value=DT1[["P0"]])
但是,如何在不先排序的情况下将数据表“合并” DT2
?
我们可以将两个数据集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提到的,我们可以ifelse
在加入“ ID”之后使用条件来替换“ P”中的NA元素。
DT2[DT1, P := ifelse(is.na(P), i.P0, P), on = 'ID']
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句