Ersetzen von Zeichenwerten durch NA in einem Datenrahmen

70

Ich habe einen Datenrahmen, der (an zufälligen Stellen) einen Zeichenwert (z. B. "foo") enthält, den ich durch einen ersetzen möchteNA .

Was ist der beste Weg, dies über den gesamten Datenrahmen hinweg zu tun?

Roberto
quelle
2
Vergessen Sie nicht, Ihre Spalte neu zu definieren, da. Du musst es erzwingen. (Wenn Sie das tun)
Brandon Bertelsen

Antworten:

98

Diese:

df[ df == "foo" ] <- NA
c-urchin
quelle
17
Beachten Sie, dass umgekehrt ( df[ df == NA ] = "foo") nicht funktioniert , wenn Sie versuchen, NA durch "foo" zu ersetzen . Sie müssten verwendendf[is.na(df)] <- "foo"
Andy Barbour
68

Eine Möglichkeit, dies im Keim zu ersticken, besteht darin, dieses Zeichen in NA umzuwandeln, wenn Sie die Daten zuerst einlesen.

df <- read.csv("file.csv", na.strings = c("foo", "bar"))
JoFrhwld
quelle
15

Mit dplyr::na_ifkönnen Sie bestimmte Werte durch ersetzen NA. In diesem Fall wäre das "foo".

library(dplyr)
set.seed(1234)

df <- data.frame(
  id = 1:6,
  x = sample(c("a", "b", "foo"), 6, replace = T),
  y = sample(c("c", "d", "foo"), 6, replace = T),
  z = sample(c("e", "f", "foo"), 6, replace = T),
  stringsAsFactors = F
)
df
#>   id   x   y   z
#> 1  1   a   c   e
#> 2  2   b   c foo
#> 3  3   b   d   e
#> 4  4   b   d foo
#> 5  5 foo foo   e
#> 6  6   b   d   e

na_if(df$x, "foo")
#> [1] "a" "b" "b" "b" NA  "b"

Wenn Sie dies für mehrere Spalten tun müssen, können Sie von "foo"durchlaufen mutate_at.

df %>%
  mutate_at(vars(x, y, z), na_if, "foo")
#>   id    x    y    z
#> 1  1    a    c    e
#> 2  2    b    c <NA>
#> 3  3    b    d    e
#> 4  4    b    d <NA>
#> 5  5 <NA> <NA>    e
#> 6  6    b    d    e
camille
quelle
4

Eine weitere Option ist is.na<-:

is.na(df) <- df == "foo"

Beachten Sie, dass seine Verwendung möglicherweise etwas kontraintuitiv erscheint, aber dem Index auf der rechten Seite tatsächlich Werte zugewiesen NA werden df.

Axeman
quelle
2
oder das gleiche'is.na<-'(df, df=="foo")
jogo
3

Dies könnte gemacht werden mit dplyr::mutate_all()und replace:

library(dplyr)
df <- data_frame(a = c('foo', 2, 3), b = c(1, 'foo', 3), c = c(1,2,'foobar'),  d = c(1, 2, 3))

> df
# A tibble: 3 x 4
     a     b      c     d
  <chr> <chr>  <chr> <dbl>
1   foo     1      1     1
2     2   foo      2     2
3     3     3 foobar     3


df <- mutate_all(df, funs(replace(., .=='foo', NA)))

> df
# A tibble: 3 x 4
      a     b      c     d
  <chr> <chr>  <chr> <dbl>
1  <NA>     1      1     1
2     2  <NA>      2     2
3     3     3 foobar     3

Eine weitere dplyrOption ist:

df <- na_if(df, 'foo') 
sbha
quelle
0

Eine alternative Lösung finden Sie unten:

for (i in 1:ncol(DF)){
  DF[which(DF[,i]==""),columnIndex]<-"ALL"
  FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL"
}
Abhi
quelle
0

Angenommen, Sie kennen die Spaltennamen nicht oder haben keine große Anzahl von Spalten zur Auswahl, is.character()könnte dies hilfreich sein.

df <- data.frame(
  id = 1:6,
  x = sample(c("a", "b", "foo"), 6, replace = T),
  y = sample(c("c", "d", "foo"), 6, replace = T),
  z = sample(c("e", "f", "foo"), 6, replace = T),
  stringsAsFactors = F
)
df
#   id   x   y   z
# 1  1   b   d   e
# 2  2   a foo foo
# 3  3   a   d foo
# 4  4   b foo foo
# 5  5 foo foo   e
# 6  6 foo foo   f

df %>% 
  mutate_if(is.character, list(~na_if(., "foo")))
#   id    x    y    z
# 1  1    b    d    e
# 2  2    a <NA> <NA>
# 3  3    a    d <NA>
# 4  4    b <NA> <NA>
# 5  5 <NA> <NA>    e
# 6  6 <NA> <NA>    f
Prradep
quelle