2013-03-09 37 views
2

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

謝謝。

+1

我假設你說錯了27和23的平均值是38.5。 – A5C1D2H2I1M1N2O1R2T1 2013-03-09 07:12:13

+0

是的,正確的意思是25.0。 – NoraNorad 2013-03-13 06:57:11

+0

如果NA與另一個NA相鄰,該怎麼辦? – xwang 2016-07-26 15:41:22

回答

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 
4

這裏使用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

+0

非常感謝。 – NoraNorad 2013-03-13 07:04:58

+0

謝謝你的幫助,我嘗試過使用上面的方法,但是我沒有像你那樣得到相同的答案。我得到的推測值是NA之前的值,而不是之前的平均值,在NA之後。我怎麼解決這個問題?。再次感謝。 – NoraNorad 2013-03-26 03:53:45

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參數可以指定計算中考慮每邊有多少個鄰居。