将一个数据集中的缺失值(NA)替换为列匹配的另一个数据集中的值

use*_*754 9 r plyr

我有一个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 的最佳方法是什么?

Fra*_*ank 7

我会这样做:

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的答案.

  • 或者``dt1 [is.na(x),x:= dt2 [.SD,x,on = c("y","z")]]` (2认同)