J'ai un bloc de données contenant (à des endroits aléatoires) une valeur de caractère (disons "foo"
) que je veux remplacer par un NA
.
Quelle est la meilleure façon de le faire sur l'ensemble de la trame de données?
Cette:
df[ df == "foo" ] <- NA
Une façon d'étouffer cela dans l'œuf est de convertir ce caractère en NA lorsque vous lisez les données en premier lieu.
df <- read.csv("file.csv", na.strings = c("foo", "bar"))
Une autre option est is.na<-
:
is.na(df) <- df == "foo"
Notez que son utilisation peut sembler un peu contre-intuitive, mais en fait attribueNA
des valeurs à df
à l'index sur le côté droit.
Cela pourrait être fait avec dplyr::mutate_all()
et 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
Une autre option dplyr
est:
df <- na_if(df, 'foo')
En utilisant dplyr::na_if
, vous pouvez remplacer des valeurs spécifiques par NA
. Dans ce cas, ce serait "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"
Si vous devez effectuer cette opération pour plusieurs colonnes, vous pouvez passer "foo"
à partir de 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
Une autre façon de résoudre est ci-dessous:
for (i in 1:ncol(DF)){
DF[which(DF[,i]==""),columnIndex]<-"ALL"
FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL"
}