我是 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
谢谢你。
我是 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
谢谢你。
这是一个使用 from na.locf
fromzoo
包的解决方案,它将每个 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
EDIT
rev
参数已被弃用,因此我将其替换为fromlast
只是另一种方式:
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
这将是您可以采取的基本手动方法:
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]))
您正在寻找移动平均插补 - 您可以为此使用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参数,您可以指定计算时要考虑每边有多少邻居。