假设数据如下:
df <- data.frame(ID=1:6, Value=c(NA, 1, NA, NA, 2, NA))
df
ID Value
1 1 NA
2 2 1
3 3 NA
4 4 NA
5 5 2
6 6 NA
我希望推算的结果如下:
ID Value
1 1 1.0
2 2 1.0
3 3 1.5
4 4 1.5
5 5 2.0
6 6 2.0
更具体地说,我想用第一个前一个和后一个非缺失数据的平均值来估算缺失数据,如果只存在先前或后一个非缺失数据中的一个,则使用这个非缺失数据。缺少所有数据的行为。
我怎么能在R?中做到这一点?
答案 0 :(得分:1)
使用approxfun
查看rule=2
的设计。这并不是你要求的(因为它在NA间隙中进行线性插值而不是替换间隙端点的平均值),但它可能是可以接受的:
> approxfun(df$ID, df$Value, rule=2)(df$ID)
[1] 1.000000 1.000000 1.333333 1.666667 2.000000 2.000000
使用rule=2
时,它的行为符合你想要的极端情况。 zoo-package中还有na.approx
个方法。
我会警告不要将这些数据用于任何进一步的统计推断。这种估算方法基本上是说在没有测量期间不存在随机变化的可能性,而且世界通常不那么一致。
答案 1 :(得分:1)
使用na.locf
向前和向后并取平均值:
library(zoo)
both <- cbind( na.locf(df$Value, na.rm = FALSE),
na.locf(df$Value, na.rm = FALSE, fromLast = TRUE))
transform(df, Value = rowMeans(both, na.rm = TRUE))
,并提供:
ID Value
1 1 1.0
2 2 1.0
3 3 1.5
4 4 1.5
5 5 2.0
6 6 2.0
答案 2 :(得分:0)
这应该有用。
for( i in 1:nrow(df)){
if(is.na(df$Value[i])){
df$Value[i] <- mean(df$Value[1:i])
}
}
我不知道这是不是你想要的。我不明白你的陈述。 “如果只有前一个或后一个非缺失数据中的一个存在,那么我想用第一个前一个和后一个非缺失数据的平均值来估算丢失的数据,用这个非缺失数据进行估算”
您希望找到更换NA的平均值?