首页 > 解决方案 > 在 full_join() 之后如何用其他来源的数据替换一个来源中的 NA

问题描述

连接两个数据框时,如何将一个数据集中的缺失值替换为另一个数据集中的值?

我的工作示例来自 3 波(时间点)研究,其中一些问题从连续波中省略。我想生成一个完整的数据集,其中包含长格式的所有波,我可以轻松地将其拆分为更小的集合,同时保持所有变量的意义。

这是一些可重现的代码:

df1<-data.frame(id=seq(10),
                sex=rep(c(1,2), 5),
                age=sample(c(18:24), 10, replace = T),
                x = rnorm(10),
                wave = rep("wave1", 10))

df2<-data.frame(id=seq(10),
                x = rnorm(10),
                wave = rep("wave2", 10))

dplyr::full_join(df1, df2)

Joining, by = c("id", "x", "wave")
   id sex age          x  wave
1   1   1  18  0.7236847 wave1
2   2   2  18  0.5730599 wave1
3   3   1  21  2.0341799 wave1
4   4   2  20 -0.1531575 wave1
5   5   1  18 -0.6089901 wave1
6   6   2  18 -0.3233804 wave1
7   7   1  19 -0.1417807 wave1
8   8   2  21  0.9557512 wave1
9   9   1  24  0.6522168 wave1
10 10   2  20  0.1595824 wave1
11  1  NA  NA  1.9694018 wave2
12  2  NA  NA  1.4153806 wave2
13  3  NA  NA  1.1160011 wave2
14  4  NA  NA -0.6040353 wave2
15  5  NA  NA -0.3750569 wave2
16  6  NA  NA  0.4826182 wave2
17  7  NA  NA  0.7210480 wave2
18  8  NA  NA  1.9068413 wave2
19  9  NA  NA  1.5355046 wave2
20 10  NA  NA  1.3607414 wave2

我的目标是:根据参与者用 wave1 数据id替换 wave2 测量中的 NA sexage

编辑:请假设,我不再有权访问df1并且df2- 我只使用联合数据,实际上还有更多变量伴随着 `NA`s。我应该早点指定这一点。

标签: rdataframedplyr

解决方案


更新

无法访问 df1 和 df2,您可以使用zoo's na.locf-function

df <- dplyr::full_join(df1, df2)

library( zoo )
library( data.table )

dt <- setDT(df)[, `:=`( sex = zoo::na.locf( zoo::na.locf( sex, na.rm = FALSE ) ),
                        age = zoo::na.locf( zoo::na.locf( age, na.rm = FALSE ) ) ), by = id ]
dt

#    id sex age           x  wave
# 1:  1   1  22 -1.03971504 wave1
# 2:  2   2  22 -0.40848104 wave1
# 3:  3   1  18 -0.32354030 wave1
# 4:  4   2  23  0.01220463 wave1
# 5:  5   1  24  0.83800380 wave1
# 6:  6   2  19  0.31674395 wave1
# 7:  7   1  22 -0.62997068 wave1
# 8:  8   2  19 -0.02830660 wave1
# 9:  9   1  23 -0.48257814 wave1
# 10: 10   2  24 -0.82725441 wave1
# 11:  1   1  22 -2.04179796 wave2
# 12:  2   2  22  1.66578389 wave2
# 13:  3   1  18  0.63893257 wave2
# 14:  4   2  23  0.37758646 wave2
# 15:  5   1  24 -1.64174887 wave2
# 16:  6   2  19 -2.93152667 wave2
# 17:  7   1  22  0.14474519 wave2
# 18:  8   2  19 -1.18826640 wave2
# 19:  9   1  23  0.68365951 wave2
# 20: 10   2  24 -0.21636650 wave2

推荐阅读