长格式数据:计算 x 年的 NA 作为其他年份的行平均值

问题描述 投票:0回答:1

我有一个相当大的纵向数据集,范围从 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 相同的那些行,以便不同受访者的值不会混合起来?

预先感谢您的每一个建议。祝圣诞快乐并保持健康:)

r dataframe row na long-format-data
1个回答
0
投票

您要问的是插补,其中有不同的方法可以替换空/空/

NA
值。其中一种方法涉及基于一个或多个其他非空变量的回归值。

dplyr

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))
© www.soinside.com 2019 - 2024. All rights reserved.