использование grepl для заполнения значения переменной приводит к странным результатам в R

У меня есть data.frame с факторной переменной 3 уровня в R

'data.frame':   23848 obs. of  14 variables:
 $ Factor_var        : Factor w/ 3 levels "AAA","BBB",..: 1 1 3 3 3 3 2 2 2 2 ...

Я хочу перезаписать одно из значений другой строкой с помощью функции grepl, но только если это одно из значений, иначе оно должно остаться прежним

DF$Factor_var <- ifelse(grepl("AAA", DF$Factor_var), "ZZZ", DF$Factor_var)

После запуска этого преобразования я возвращаю переменную chr только со строковыми значениями, которые я только что ввел, и значениями, относящимися к значению уровня старых строк.

'data.frame':   23848 obs. of  14 variables:
  $ Factor_var       : chr  "ZZZ" "ZZZ" "3" "3" ...

тогда как я все еще ожидаю факторную переменную с уровнями "ZZZ", "BBB"... и т.д.

Почему это? Я просто не могу обойти эту проблему!

СПАСИБО


person Garamvölgyi Mihály    schedule 27.09.2016    source источник
comment
Если это factor, измените levels, т.е. levels(DF$Factor_var) <- ifelse(grepl("AAA", levels(DF$Factor_var)), "ZZZ", levels(DF$Factor_var))   -  person akrun    schedule 27.09.2016


Ответы (2)


Используйте функцию замены для того же

xy <-levels(df$Factor_var)

xy <- replace(xy,xy%in%"AAA","ZZZ")

levels(df$Factor_var) <- xy
person Arun kumar mahesh    schedule 27.09.2016

Поскольку данные уже являются фактором, вы можете просто изменить уровень с помощью levels()<- На данный момент нет необходимости в grepl() или ifelse(). Так что просто сделайте:

levels(DF$Factor_var) <- c("ZZZ","BBB","CCC")

Например:

var1 <- c("AA", "BB", "CC", "AA", "BB", "CC")
 df <- data.frame(var1)

> df$var1
[1] AA BB CC AA BB CC
Levels: AA BB CC

а затем просто выполните:

levels(df$var1) <- c("ZZ","BB","CC")

что приводит к:

df$var1
[1] ZZ BB CC ZZ BB CC
Levels: ZZ BB CC

str(df)
'data.frame':   6 obs. of  1 variable:
$ var1: Factor w/ 3 levels "ZZ","BB","CC": 1 2 3 1 2 3
person Benjamin Mohn    schedule 27.09.2016