web-dev-qa-db-fra.com

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

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?

57
Roberto

Cette:

df[ df == "foo" ] <- NA
78
c-urchin

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"))
65
JoFrhwld

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.

4
Axeman

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

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
2
camille

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"
}
0
Abhi