977 Stimmen

Wie kann ich NA-Werte in einem R-Datenrahmen durch Nullen ersetzen?

Ich habe ein Datenrahmen und einige Spalten haben NA-Werte.

Wie kann ich diese NA-Werte durch Nullen ersetzen?

16 Stimmen

Kleine Änderung von stackoverflow.com/questions/7279089/… (die ich durch die Suche nach "[r] Ersatz von NA durch Null" gefunden habe) ...

0 Stimmen

@psychonomics Was ist der Unterschied zwischen Ihrem Kommentar und der besten Antwort?

1 Stimmen

@svp - Vielleicht nichts? Ich kann meinen Kommentar nicht sehen. Ist es möglich, dass ich ihn gelöscht habe und du ihn immer noch sehen kannst?

7voto

Zahra Punkte 77

Sie können replace() verwenden

Zum Beispiel:

> x <- c(-1,0,1,0,NA,0,1,1)
> x1 <- replace(x,5,1)
> x1
[1] -1  0  1  0  1  0  1  1

> x1 <- replace(x,5,mean(x,na.rm=T))
> x1
[1] -1.00  0.00  1.00  0.00  0.29  0.00 1.00  1.00

7voto

MS Berends Punkte 3286

Das cleaner-Paket verfügt über eine generische Funktion na_replace(), die standardmäßig numerische Werte durch Nullen, logische Werte durch FALSE, Datumswerte durch den aktuellen Tag usw. ersetzt:

library(dplyr)
library(cleaner)

starwars %>% na_replace()
na_replace(starwars)

Es unterstützt sogar vektorisierte Ersetzungen:

mtcars[1:6, c("mpg", "hp")] <- NA
na_replace(mtcars, mpg, hp, replacement = c(999, 123))

Dokumentation: https://msberends.github.io/cleaner/reference/na_replace.html

5voto

Antti Punkte 1212

Another dplyr Pipe-kompatible Option mit der tidyr-Methode replace_na, die für mehrere Spalten funktioniert:

require(dplyr)
require(tidyr)

m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
d <- as.data.frame(m)

myList <- setNames(lapply(vector("list", ncol(d)), function(x) x <- 0), names(d))

df <- d %>% replace_na(myList)

Sie können es leicht auf z.B. numerische Spalten beschränken:

d$str <- c("string", NA)

myList <- myList[sapply(d, is.numeric)]

df <- d %>% replace_na(myList)

3voto

davsjob Punkte 1712

Eine einfache Möglichkeit, dies zu schreiben, ist mit if_na von hablar:

library(dplyr)
library(hablar)

df <- tibble(a = c(1, 2, 3, NA, 5, 6, 8))

df %>% 
  mutate(a = if_na(a, 0))

was zurückgibt:

      a

1     1
2     2
3     3
4     0
5     5
6     6
7     8

3voto

Fábio Punkte 721

Diese einfache Funktion, die aus Datacamp extrahiert wurde, könnte helfen:

replace_missings <- function(x, replacement) {
  is_miss <- is.na(x)
  x[is_miss] <- replacement

  Nachricht(sum(is_miss), " fehlende Werte wurden durch den Wert ", replacement, " ersetzt")
  x
}

Dann

replace_missings(df, replacement = 0)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X