R:用前一个和后一个非缺失数据的平均值插补缺失数据

R:用前一个和后一个非缺失数据的平均值插补缺失数据,r,R,假设数据如下所示: 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 更具体地说,我想用前一个和后一个非缺失数据的平均值来插补缺失数据,如果只有前一个或后一个非缺失数据存在,用这个非缺失数据插补。未定义缺少所有数据的行为 我怎样才能在R中做到这一点?这应该可以 for(

假设数据如下所示:

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
更具体地说,我想用前一个和后一个非缺失数据的平均值来插补缺失数据,如果只有前一个或后一个非缺失数据存在,用这个非缺失数据插补。未定义缺少所有数据的行为

我怎样才能在R中做到这一点?

这应该可以

for( i in 1:nrow(df)){
    if(is.na(df$Value[i])){
        df$Value[i] <- mean(df$Value[1:i])
    }
}
for(1中的i:nrow(df)){
if(is.na(df$Value[i])){

df$Value[i]看看
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软件包中还有
na.approx
方法


我要提醒大家,不要将这些数据用于任何进一步的统计推断。这种插补方法本质上是说,在不进行测量的时期内,不存在随机变化的可能性,而且世界通常不那么一致。

向前和向后使用
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))

这似乎就是您要寻找的:imputeTS::interpolation和zoo::appro可能值得一看,以获得与请求的解决方案类似的解决方案(实际上不是100%的请求结果)
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