R的前后均值归算

  • 本文关键字: missing-data imputation
  • 更新时间 :
  • 英文 :


我是r中的新成员,我的问题是如何使用缺失数据点前后的平均值来估算缺失值?

例子;

使用每个NA的上、下的平均值作为估算值。

-行号3的平均值为38.5

-第7行平均值为32.5

age
52.0
27.0
NA
23.0
39.0
32.0
NA
33.0
43.0

谢谢。

这是一个使用na.locfzoo包的解决方案,它将每个NA替换为最近的非NA的先验或后验。

0.5*(na.locf(x,fromlast=TRUE) + na.locf(x))
[1] 52.0 27.0 25.0 23.0 39.0 32.0 32.5 33.0 43.0

在这里的优势,如果你有一个以上的连续NA。

x <- c(52, 27, NA, 23, 39, NA, NA, 33, 43)
0.5*(na.locf(x,fromlast=TRUE) + na.locf(x))
[1] 52 27 25 23 39 36 36 33 43

编辑rev参数已弃用,因此我将其替换为fromlast

您正在寻找移动平均Imputation -您可以使用imputeTSna_ma函数。

library(imputeTS)
x <- c(52, 27, NA, 23, 39, NA, NA, 33, 43)
na_ma(x, k=1, weighting = "simple")

[1] 5200000 2700000 2500000 2300000 3900000 31.66667 38.3333333.00000 - 43.00000

这会产生所需的结果。使用k参数,您可以指定在计算时要考虑每侧的邻居数量。

这将是您可以采用的基本手动方法:

age <- c(52, 27, NA, 23, 39, 32, NA, 33, 43)
age[is.na(age)] <- rowMeans(cbind(age[which(is.na(age))-1], 
                                  age[which(is.na(age))+1]))
age
# [1] 52.0 27.0 25.0 23.0 39.0 32.0 32.5 33.0 43.0

或者,因为你似乎有一个单独的列data.frame:

mydf <- data.frame(age = c(52, 27, NA, 23, 39, 32, NA, 33, 43))
mydf[is.na(mydf$age), ] <- rowMeans(
  cbind(mydf$age[which(is.na(mydf$age))-1],
        mydf$age[which(is.na(mydf$age))+1]))

只是另一种方式:

age <- c(52, 27, NA, 23, 39, 32, NA, 33, 43)
age[is.na(age)] <- apply(sapply(which(is.na(age)), "+", c(-1, 1)), 2, 
                         function(x) mean(age[x]))
age
## [1] 52.0 27.0 25.0 23.0 39.0 32.0 32.5 33.0 43.0

相关内容

  • 没有找到相关文章

最新更新