Использование 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" ... и т. д.

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

Спасибо

2 ответа

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

xy <-levels(df$Factor_var)

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

levels(df$Factor_var) <- xy

Поскольку данные уже являются фактором, вы можете просто изменить уровень с помощью 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
Другие вопросы по тегам