R:使用另一个数据 table 的值更新数据 table 中的 NA
R: Updating NAs in a data table with values of another data table
有两个数据table如下结构:
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))
在数据 tableDT2
中,列 P
中的所有 NA 应更新为数据 table DT1
中的值 P0
。
如果DT2
像DT1
一样被ID
排序,问题可以这样解决:
setorder(DT2,ID)
idxr <- which(DT2[["t"]]==1)
set(DT2, i=idxr, j="P", value=DT1[["P0"]])
但是数据table怎么会是"merged"之前没有排序DT2
呢?
我们可以加入两个数据集on
'ID',对于'P'中的NA值,我们将'P'分配为'P0',然后删除'P0' 通过将其分配给 'NULL'.
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']
这里还有一个按条件加入的选项
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
有两个数据table如下结构:
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))
在数据 tableDT2
中,列 P
中的所有 NA 应更新为数据 table DT1
中的值 P0
。
如果DT2
像DT1
一样被ID
排序,问题可以这样解决:
setorder(DT2,ID)
idxr <- which(DT2[["t"]]==1)
set(DT2, i=idxr, j="P", value=DT1[["P0"]])
但是数据table怎么会是"merged"之前没有排序DT2
呢?
我们可以加入两个数据集on
'ID',对于'P'中的NA值,我们将'P'分配为'P0',然后删除'P0' 通过将其分配给 'NULL'.
library(data.table)#v1.9.6+
DT2[DT1, on='ID'][is.na(P), P:= P0][, P0:= NULL][]
或者正如@DavidArenburg 提到的,我们可以在加入 'ID' 后使用 ifelse
条件来替换 'P'.
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