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.
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
Beachten Sie, dass seine Verwendung möglicherweise etwas kontraintuitiv erscheint, aber dem Index auf der rechten Seite tatsächlich Werte zugewiesenNA werden df.
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 11122 foo 22333 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> 11122 <NA> 22333 foobar 3
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
Antworten:
Diese:
df[ df == "foo" ] <- NA
quelle
df[ df == NA ] = "foo"
) nicht funktioniert , wenn Sie versuchen, NA durch "foo" zu ersetzen . Sie müssten verwendendf[is.na(df)] <- "foo"
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"))
quelle
Mit
dplyr::na_if
können Sie bestimmte Werte durch ersetzenNA
. 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"
durchlaufenmutate_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
quelle
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
werdendf
.quelle
'is.na<-'(df, df=="foo")
Dies könnte gemacht werden mit
dplyr::mutate_all()
undreplace
: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')
quelle
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" }
quelle
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
quelle