85 votes

Remplacement des valeurs de caractères par NA dans une trame de données

J'ai une trame de données contenant (dans 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 du cadre de données ?

123voto

c-urchin Points 1012

Ceci :

df[ df == "foo" ] <- NA

75voto

JoFrhwld Points 4142

Une façon de pincer cela dans le bourgeon 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"))

24voto

camille Points 9795

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 le faire pour plusieurs colonnes, vous pouvez passer de "foo" partir de mutate avec across (mis à jour pour dplyr v1.0.0+).

df %>%
  mutate(across(c(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

4voto

Axeman Points 4664

Une autre option est is.na<- :

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

Notez que son utilisation peut sembler un peu contre-intuitive, mais il attribue en fait NA valeurs à df à l'indice sur le côté droit.

4voto

sbha Points 1948

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') 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X