用第二个数据框中的值替换第一个数据框中的NA值

3

I have two dataframes that look like so:

df1:

     A    B    C    D   E   F.              EMAIL
1   78   46   65   59  NA  NA. bill@microsoft.com
2   60   51   64   67  NA  NA. bill@microsoft.com
3   72   83   54   72  NA  NA. bill@microsoft.com

df2:

     A    B    C    D   E   F.              EMAIL
1   NA   NA   NA   NA  71  99. bill@microsoft.com
2   NA   NA   NA   NA  53  74. bill@microsoft.com

我希望得到的结果是:df3

     A    B    C    D   E   F               EMAIL
1   78   46   65   59  71  99. bill@microsoft.com
2   60   51   64   67  53  74. bill@microsoft.com
3   72   83   54   72  NA  NA. bill@microsoft.com

我已经尝试使用merge、coalesce、join和rqdatable,但都没有成功。我是R语言的新手,对于如何实现这个目标已经没有更多的想法了。如何用第二个数据框的值替换第一个数据框的值?

谢谢! -g


1
根据我的经验,要可靠地完成这个任务,应该有以下两种方式之一:(1) 一个共同的“id”字段,以便可以权威地将一个数据框中的行与另一个数据框中的行相对应;或者 (2) 确定一个数据框中的第n行与另一个数据框中的第n行完全对应。 - r2evans
1
df1 有3行,而 df2 有2行,这告诉我...我的第二个假设是不正确的,因此请参考第一点:如果您没有为每行设置一些共同的唯一标识符,则建议您的数据结构不适合进行此类操作。这样做是不安全或不可取的。 - r2evans
有一个共同的ID,我刚才省略了它。现在我已经添加回去了。 - Gary
1
这并不是我想要的。在df1中,每行是否有唯一的ID与df2中的第一行相对应(例如,df1的第一行与df2的第一行相对应)?或者每列中数字的顺序无关紧要?如果您的输出$E变成了c(53,71,NA),那么意义会有所不同吗? - r2evans
1
在这种情况下,顺序并不重要。我只想获取第二组中的第一行,并将其与第一组中的第一行合并。 - Gary
2个回答

4
i <- seq(nrow(df2))

df1[i,] <- Map(function(x, y) ifelse(is.na(x), y, x),
               df1[i,], df2)

df1
#    A  B  C  D  E  F
# 1 78 46 65 59 71 99
# 2 60 51 64 67 53 74
# 3 72 83 54 72 NA NA

谢谢!非常好用。 - Gary

1
我们可以使用data.table方法。
library(data.table)
nm1 <- c('A', 'B', 'C', 'D', 'E', 'F')
setDT(df1)[, (nm1) := Map(fcoalesce, .SD, df2[nm1]), .SDcols = nm1] 

谢谢!我还没有尝试过,但我会把它加入我的笔记中。这对我正在处理的其他事情也很有用。 - Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接