2014-04-07 10 views
8

Wie könnte ich eine NA mit Mittelwert seiner vorherigen und nächsten Zeilen auf schnelle Weise ersetzen?Ersetzen Sie NA durch vorherige und nächste Zeilen bedeuten in R

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

, so dass B Klasse wäre 63.

+0

Was passiert, wenn der benachbarte Wert als auch fehlt? Vielleicht versuchen [diesen Ansatz] (http://stackoverflow.com/questions/22736316/r-missing-value-replacement-function/22736656#22736656)? –

Antwort

9

Oder versuchen Sie na.approx aus Paket zoo: "Fehlende Werte (NAs) werden durch lineare Interpolation“

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

ersetzt Dies funktioniert auch, wenn Sie mehr als eine aufeinanderfolgende NA haben:

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 auf der base Funktion approx basiert, die stattdessen verwendet werden können:

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

Angenommen, Sie haben eine data.frame df wie folgt aus:

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

Dann können Sie verwenden, um die folgenden:

> 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

verwendet dies, um Folgendes zu tun: Wenn x = Bedingung, ersetzen Sie X und nächsten 2 Werte mit Hilfe von X-1 und X + 3. was den Code ändert in: 'ind <- was (df $ grade <(- 100))' und 'df $ grade [ind: ind + 2] <- sapply (ind, funktion (i) mit (df, mean (c (Note [i-1], Note [i + 3])))) ' Für x <-100 – Anne

+0

Als Alternative zum' sapply' Aufruf können Sie auch verwenden: 'df $ grade [ind] <- mit (df, ((Note [ind-1] + Note [ind + 1])/2)) ' – Jaap

0

Eine alternative Lösung, die den Median anstelle von Mittelwert verwendet, wird durch diedargestelltFunktion des randomForest Pakets. Wie in der documentation beschrieben, arbeitet es mit einem Datenrahmen oder einer numerischen Matrix. Speziell für numerische Variablen werden NAs durch Spaltenmediane ersetzt. Für Faktorvariablen werden NAs durch die häufigsten Stufen ersetzt (zufällige Brüche). Wenn das Objekt NAs enthält, wird es unverändert zurückgegeben.

die gleichen Beispiele wie @Henrik verwenden,

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

#[1] 56 70 70 96 

oder mit einer größeren Matrix:

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 
Verwandte Themen