我在小组中处理 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))
谢谢
注意:你的描述与给出的数据不符(只有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
。您现在可以重新绑定或替换列。