我有一个相当大的纵向数据集,范围从 2014 年到 2021 年。大多数变量每年都可用。但是,有一些变量适用于 2014 年和 2016 年,但不适用于 2015 年。在这些情况下,我想将 2015 年的值计算为 2014 年和 2016 年值的平均值。
所以数据结构如下所示。请注意,这是极其简化的,数据集具有更多的变量和观察结果。此外,对于每个受访者来说,还有其他年份的行(显然),我没有在这里写下
PID | 年份 | 变量1 | 变量2 | 变量 3 |
---|---|---|---|---|
1 | 2014 | 10 | 2 | 2 |
1 | 2015 | 15 | 8 | 不适用 |
1 | 2016 | 12 | 6 | 4 |
2 | 2014 | 11 | 7 | 5 |
2 | 2015 | 16 | 3 | 不适用 |
2 | 2016 | 14 | 5 | 9 |
PID 是识别每个受访者的 ID/号码。 Var1和Var2每年都可用,Var3仅在2014年和2015年可用
我想要的是这个:
PID | 年份 | 变量1 | 变量2 | 变量 3 |
---|---|---|---|---|
1 | 2014 | 10 | 2 | 2 |
1 | 2015 | 15 | 8 | 3 |
1 | 2016 | 12 | 6 | 4 |
2 | 2014 | 11 | 7 | 5 |
2 | 2015 | 16 | 3 | 7 |
2 | 2016 | 14 | 5 | 9 |
对于 Var3,2015 年的行包含 2014 年和 2016 年值的平均值,而不是 NA。 我怎样才能实现这个目标?
我的第一个想法是通过
is.na()
解决2015年的缺失值,但这将解决整个数据集中的所有NA,而不仅仅是2015年Var2的NA。我如何具体解决这些 NA,以便 a) 仅将 2015 年的值计算为 Var2 的 2014 年和 2016 年的平均值,b) 仅计算 PID 相同的那些行,以便不同受访者的值不会混合起来?
预先感谢您的每一个建议。祝圣诞快乐并保持健康:)
您要问的是插补,其中有不同的方法可以替换空/空/
NA
值。其中一种方法涉及基于一个或多个其他非空变量的回归值。
library(dplyr)
quux %>%
mutate(across(-Year, ~ coalesce(.x, approx(Year, .x, xout = Year)$y)), .by = PID)
# PID Year Var 1 Var 2 Var 3
# 1 1 2014 10 2 2
# 2 1 2015 15 8 3
# 3 1 2016 12 6 4
# 4 2 2014 11 7 5
# 5 2 2015 16 3 7
# 6 2 2016 14 5 9
数据
quux <- structure(list(PID = c(1L, 1L, 1L, 2L, 2L, 2L), Year = c(2014L, 2015L, 2016L, 2014L, 2015L, 2016L), "Var 1" = c(10L, 15L, 12L, 11L, 16L, 14L), "Var 2" = c(2L, 8L, 6L, 7L, 3L, 5L), "Var 3" = c(2L, NA, 4L, 5L, NA, 9L)), class = "data.frame", row.names = c(NA, -6L))