2014-04-07 45 views
8

我怎樣才能以快速的方式將NA與其上一行和下一行的平均值進行替換?用上一行和下一行替換NA意味着在R

name grade 
1 A 56 
2 B NA 
3 C 70 
4 D 96 

,使得B的等級是63

+0

如果相鄰的值丟失,以及?也許嘗試[這種方法](http://stackoverflow.com/questions/22736316/r-missing-value-replacement-function/22736656#22736656)? –

回答

9

或者您可以嘗試na.approx從包zoo:「Missing values(

vals <- c(1, NA, NA, 7, NA, 10) 
na.approx(vals) 
# [1] 1.0 3.0 5.0 7.0 8.5 10.0 

na.approx是基於base功能approx,它可以用來代替:NAS)是由線性插值」

library(zoo) 
x <- c(56, NA, 70, 96) 
na.approx(x) 
# [1] 56 63 70 96 

,如果你有一個以上的連續NA這也適用代替

vals <- c(1, NA, NA, 7, NA, 10) 
xout <- seq_along(vals) 
x <- xout[!is.na(vals)] 
y <- vals[!is.na(vals)] 

approx(x = x, y = y, xout = xout)$y 
# [1] 1.0 3.0 5.0 7.0 8.5 10.0 
8

假設你有一個這樣的data.frame df

> df 
    name grade 
1 A 56 
2 B NA 
3 C 70 
4 D 96 
5 E NA 
6 F 95 

然後你可以使用以下命令:

> ind <- which(is.na(df$grade)) 
> df$grade[ind] <- sapply(ind, function(i) with(df, mean(c(grade[i-1], grade[i+1])))) 
> df 
    name grade 
1 A 56 
2 B 63 
3 C 70 
4 D 96 
5 E 95.5 
6 F 95 
+0

用於執行以下操作:如果x = condition,則用x-1和x + 3的平均值替換x和接下來的2個值。 (ind),函數(i)與(df,mean())相比,代碼更改爲:'ind < - 其中(df $ grade <( - 100))'和 'df $ grade [ind:ind + 2] < - sapply (c(等級[i-1],等級[i + 3]))))' 對於x <-100 – Anne

+0

作爲'sapply'調用的替代方法,您還可以使用:'df $ grade [ind] ( - (df,((等級[ind-1] +等級[ind + 1])/ 2)) – Jaap

0

使用中位數代替平均值的替代解決方案由na.roughfix功能的randomForest包。 如documentation中所述,它可以處理數據幀或數字矩陣。 具體而言,對於數字變量,NAs被列中值替換。對於因素變量,NAs被替換爲最常見的級別(隨機打破關係)。如果對象不包含NAs,則它將保持不變。

使用相同的例子如@Henrik,

library(randomForest) 
x <- c(56, NA, 70, 96) 
na.roughfix(x) 

#[1] 56 70 70 96 

或具有更大的矩陣:

y <- matrix(1:50, nrow = 10) 
y[sample(1:length(y), 4, replace = FALSE)] <- NA 
y 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 1 11 21 31 41 
# [2,] 2 12 22 32 42 
# [3,] 3 NA 23 33 NA 
# [4,] 4 14 24 34 44 
# [5,] 5 15 25 35 45 
# [6,] 6 16 NA 36 46 
# [7,] 7 17 27 37 47 
# [8,] 8 18 28 38 48 
# [9,] 9 19 29 39 49 
# [10,] 10 20 NA 40 50 

na.roughfix(y) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 1 11 21.0 31 41 
# [2,] 2 12 22.0 32 42 
# [3,] 3 16 23.0 33 46 
# [4,] 4 14 24.0 34 44 
# [5,] 5 15 25.0 35 45 
# [6,] 6 16 24.5 36 46 
# [7,] 7 17 27.0 37 47 
# [8,] 8 18 28.0 38 48 
# [9,] 9 19 29.0 39 49 
#[10,] 10 20 24.5 40 50