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