R之前的平均值

时间:2013-03-09 07:01:28

标签: r missing-data imputation

我是R的新手。我的问题是如何使用丢失数据点之前和之后的平均值来估算缺失值?

示例;

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

- 第3行的意思是38.5

行号7的

-mean是32.5

age
52.0
27.0
NA
23.0
39.0
32.0
NA
33.0
43.0

谢谢。

4 个答案:

答案 0 :(得分:4)

这是一个使用来自na.locf zoo的{​​{1}}解决方案的解决方案,该解决方案将每个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

答案 1 :(得分:1)

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

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]))

答案 2 :(得分: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

答案 3 :(得分:0)

您正在寻找移动平均估算 - 您可以使用 imputeTS na.ma 功能。

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

[1] 52.00000 27.00000 25.00000 23.00000 39.00000 31.66667 38.33333   33.00000 43.00000

这确实产生了所需的结果。 使用 k 参数,您可以指定计算每一侧的邻居数量。