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?
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?
Antworten:
Diese:
df[ df == "foo" ] <- NA
df[ df == NA ] = "foo") nicht funktioniert , wenn Sie versuchen, NA durch "foo" zu ersetzen . Sie müssten verwendendf[is.na(df)] <- "foo"
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
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')
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