我有一个3列的数据框(datadf),'x','y和z.缺少几个'x'值(NA).'y'和'z'是非测量变量.
x y z
153 a 1
163 b 1
NA d 1
123 a 2
145 e 2
NA c 2
NA b 1
199 a 2
Run Code Online (Sandbox Code Playgroud)
我有另一个具有相同三列的数据框(imputeddf):
x y z
123 a 1
145 a 2
124 b 1
168 b 2
123 c 1
176 c 2
184 d 1
101 d 2
Run Code Online (Sandbox Code Playgroud)
我希望将NA'datadf'中的'x' 替换为'imputeddf'中的值,其中'y'和'z'匹配两个数据集('y'和'z'的每个组合都有自己的值'x' ' 填写).
期望的结果:
x y z
153 a 1
163 b 1
184 d 1
123 a 2
145 e 2
176 c 2
124 b 1
199 a 2
Run Code Online (Sandbox Code Playgroud)
我正在尝试这样的事情:
finaldf <- datadf
finaldf$x <- if(datadf[!is.na(datadf$x)]){ddply(datadf, x=imputeddf$x[datadf$y == imputeddf$y & datadf$z == imputeddf$z])}else{datadf$x}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
NA使用我的推算值df 填写使用df 的最佳方法是什么?
我会这样做:
library(data.table)
setDT(DF1); setDT(DF2)
DF1[DF2, x := ifelse(is.na(x), i.x, x), on=c("y","z")]
Run Code Online (Sandbox Code Playgroud)
这使
x y z
1: 153 a 1
2: 163 b 1
3: 184 d 1
4: 123 a 2
5: 145 e 2
6: 176 c 2
7: 124 b 1
8: 199 a 2
Run Code Online (Sandbox Code Playgroud)
评论.这种做法是没有那么大,因为它融合了整体的DF1,而我们只需要合并的子集,其中is.na(x).在这里,改进看起来像(谢谢,@ Arun):
DF1[is.na(x), x := DF2[.SD, x, on=c("y", "z")]]
Run Code Online (Sandbox Code Playgroud)
这种方式类似于@ RHertel的答案.