R 用列匹配的另一个数据集中的值替换一个数据集中缺少的值(NA)

R 用列匹配的另一个数据集中的值替换一个数据集中缺少的值(NA),r,plyr,R,Plyr,我有一个数据帧datadf,有3列,“x”、“y”和“z”。有几个“x”值缺少NAy'和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 我有另一个数据框,用相同的三列输入DF: 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 我希望将“datadf”中“x”中的N

我有一个数据帧datadf,有3列,“x”、“y”和“z”。有几个“x”值缺少NAy'和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
我有另一个数据框,用相同的三列输入DF:

 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
我希望将“datadf”中“x”中的NA替换为“inputeddf”中的值,其中“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
我正在尝试以下事情:

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}
但它不起作用

使用我的估算值df在表格中填写NA的最佳方法是什么?

我会这样做:

library(data.table)
setDT(DF1); setDT(DF2)

DF1[DF2, x := ifelse(is.na(x), i.x, x), on=c("y","z")]

     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
评论。这种方法不是很好,因为它合并了整个DF1,而我们只需要合并其中的子集is.nax。在这里,改进看起来像是感谢,@Arun:

DF1[is.na(x), x := DF2[.SD, x, on=c("y", "z")]]
这种方式类似于@RHertel的答案

来自@Jakob的评论:

这是否适用于多个x变量?如果我想用几列填充整个数据集

您可以枚举所需的列:

DF1[DF2, `:=`(
  x = ifelse(is.na(x), i.x, x),
  w = ifelse(is.na(w), i.w, w)
), on=c("y","z")]

表达式可能可以使用lappy和substitute构造,但如果列集是固定的,则只需如上所述将其写出就可以了。

下面是一个使用base R的替代方法:

df1[is.na(df1$x),"x"] <- merge(df2,df1[is.na(df1$x),][,c("y","z")])$x
> df1
#    x y z
#1 153 a 1
#2 163 b 1
#3 124 b 1
#4 123 a 2
#5 145 e 2
#6 176 c 2
#7 184 d 1
#8 199 a 2
dplyr解决方案,概念上与上述答案相同。要仅提取与datadf中的NAs相对应的inputedDF行,请使用semi_join。然后,使用另一个连接来匹配回datadf。不幸的是,这一步不是很干净

图书馆弹琴 替换行% semi_joindatadf%>%filteris.nax,by=cy,z datadf% 左行,by=cy,z%>% mutatex=if_elseis.nax.x,x.y,x.x%>% 选择X、y、z 这将得到您想要的:

> datadf
# A tibble: 8 x 3
      x y         z
  <dbl> <chr> <dbl>
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

可能是一个样本输入和输出格式正确的示例?发布应来自该示例的所需数据帧。k添加了我的所需结果,并授予Z列2个以上选项,即数据df具有y和Z组合的多个实例,我仅尝试切换输入数据帧中值的NA值,这似乎只是将数据帧合并为一个。如果data.table允许DF1[DF2,x[is.nax]:=i.x,on=cy,z]或dt1[is.nax,x:=dt2[.SD,x,on=cy,z]],那就太好了。Frank这对多个x变量有效吗?如果我想用几列来填充整个数据集?@Jakob我用上面的一种方式编辑过,希望能有所帮助。如果你正在寻找帮助,而不是为每一列写一行,那么也许值得做一个可复制的例子,并发布一个新的问题,你的顺序是2:3,我可以用cdf$y,df$z替换它吗?如果df1有多个XIN值,包括NAs for z==1&y==1,那么设置这个错误:错误在[steps是我的x,dataimp是我的df1