我是R新手。我的問題是如何使用丟失數據點前後的均值來計算丟失值?R中的均值前後插補
示例;
使用來自每個NA的上限和下限的平均值作爲估算值。
-mean的行號3 38.5
-mean的行號7爲32.5
age
52.0
27.0
NA
23.0
39.0
32.0
NA
33.0
43.0
謝謝。
我是R新手。我的問題是如何使用丟失數據點前後的均值來計算丟失值?R中的均值前後插補
示例;
使用來自每個NA的上限和下限的平均值作爲估算值。
-mean的行號3 38.5
-mean的行號7爲32.5
age
52.0
27.0
NA
23.0
39.0
32.0
NA
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]))
只是一個其他的方式:
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
這裏使用na.locf
的解決方案從zoo
包中找到將每個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
更換您正在尋找移動平均線插補 - 您可以使用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參數可以指定計算中考慮每邊有多少個鄰居。
我假設你說錯了27和23的平均值是38.5。 – A5C1D2H2I1M1N2O1R2T1 2013-03-09 07:12:13
是的,正確的意思是25.0。 – NoraNorad 2013-03-13 06:57:11
如果NA與另一個NA相鄰,該怎麼辦? – xwang 2016-07-26 15:41:22