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_if
kö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 dplyr
Option 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