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