在R中的均值-前-后插补

3

我是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

谢谢。

1
我假设你在说27和23的平均值是38.5时犯了一个错误。 - A5C1D2H2I1M1N2O1R2T1
是的,正确的意思是25.0。 - NoraNorad
如果一个NA紧邻着另一个NA会怎样? - xwang
4个回答

5

这里提供一个解决方案,使用了 zoo 包中的 na.locf 函数,它会将每个 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


谢谢您的帮助,我尝试使用上述方法,但是我没有得到像您一样的答案。我得到的输入值是NA之前的值,而不是NA之前和之后的平均值。我该如何解决这个问题?再次感谢。 - NoraNorad
如果我们有一些连续的“NA”,例如(52,27,NA,NA,23,NA,NA,NA,33,43),我们该怎么办? - Masoud

2

您正在寻找移动平均值插值 - 您可以使用 imputeTSna_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参数,您可以指定计算时每侧考虑多少个邻居。


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接