纵向/面板数据中的 NAs

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

我在小组中处理 NA。我有五个国家,并且在五年内测量相同的变量

set.seed(100)
policy.1 <- data.frame(country= c("A","B","C","D","E"),
                       year1=c(2,4,NA,3,5),
                       year2=c(3,NA,NA,4,6),
                       year3=c(4,8,2,NA,7),
                       year4=c(5,10,4,NA,8),
                       year5=c(6,12,1,NA,9))

注意 B 国如何只有一个 NA 但 C 和 D 分别连续 2 和 3。

我的估算策略是计算 NA 之前和之后的值的平均值。

在 B 国的情况下——只有一个 NA——这应该是 4 到 8 之间的平均值。

C、D、E国更棘手。

C 缺少前两个值。我想用行中的第一个可用值填充缺失值。

D 是相反的:缺少最后三个值。我想用最后一个可用的值填充缺失值

E 缺少三个中间值。我想在行中的 NA 延伸之前和之后用平均值填充缺失值。也就是说,三个缺失值应该用(5+9)/2=7的均值代替。

输出应该是这样的:

policy.2 <- data.frame(country= c("A","B","C","D","E"),
                       year1=c(2,4,2,3,5),
                       year2=c(3,6,2,4,7),
                       year3=c(4,8,2,4,7),
                       year4=c(5,10,4,4,7),
                       year5=c(6,12,1,4,9))

谢谢

r dataframe time-series panel missing-data
1个回答
-1
投票

注意:你的描述与给出的数据不符(只有D有3个缺失值,E有0个)。

您可以只使用带有参数

mean
na.rm = TRUE
函数来忽略
NA
s。 一些代码:

set.seed(100)
policy.1 <- data.frame(country= c("A","B","C","D","E"),
                       year1=c(2,4,NA,3,5),
                       year2=c(3,NA,NA,4,6),
                       year3=c(4,8,2,NA,7),
                       year4=c(5,10,4,NA,8),
                       year5=c(6,12,1,NA,9))
my_func <- function(x) {
  x[which(is.na(x))] <- mean(x, na.rm=TRUE)
  return(x)
}

现在我们应用它:

> data.frame(policy.1$country, t(apply(policy.1[,2:6], 1, my_func)))
  policy.1.country    year1    year2 year3 year4 year5
1                A 2.000000 3.000000   4.0   5.0   6.0
2                B 4.000000 8.500000   8.0  10.0  12.0
3                C 2.333333 2.333333   2.0   4.0   1.0
4                D 3.000000 4.000000   3.5   3.5   3.5
5                E 5.000000 6.000000   7.0   8.0   9.0

my_func
计算向量的平均值(忽略
NA
)并用计算值替换
NA
的位置。
apply
的第二个参数将函数应用于行
1
或列
2
。您现在可以重新绑定或替换列。

© www.soinside.com 2019 - 2024. All rights reserved.