Переименуйте один уровень фактора в R

Я пытаюсь переименовать уровень A фактора column1 в dataframe df в R. Мой текущий подход таков:

levels(df[!is.na(df$column1) & df$column1 == 'A',]) <- 'B'

который не выдает никаких ошибок или предупреждений, но полностью неэффективен.

B не является уже существующим уровнем (который из проб и ошибок, которые я пришел к подозреваемому, был важен), поэтому следующая моя первая попытка не сработала.

df[!is.na(df$column1) & df$column1 == 'A', 'column1'] <- 'B'

Может ли кто-нибудь привести меня к правильному подходу?

Ответы

Ответ 1

Я собирался предложить

levels(df$column1)[levels(df$column1)=="A"] <- "B"

или используйте служебную функцию plyr::revalue:

library("plyr")
df <- transform(df,
          column1=revalue(column1,c("A"="B")))

transform() - это немного сахара, что не обязательно; вы можете использовать df$column1 <- revalue(df$column1(...))

Для полноты, car::recode также работает, хотя я нахожу его немного clunkier, что plyr::revalue (потому что перекодировка указана как строка с кавычками).

car::recode(df$column1,"'A'='B'")

Ответ 2

Один из способов - просто изменить метку уровня. Во-первых, некоторые тестовые данные

df <- data.frame(column1=c("A","B","C","A","B"))

и теперь мы заменим "A" на "X"

levels(df$column1) <- gsub("A","X", levels(df$column1))

и мы видим, что он изменил

  column1
1       X
2       B
3       C
4       X
5       B

Возможно, вам нужно быть осторожным с gsub(), поскольку он принимает регулярное выражение. Более конкретная замена будет

gsub("^A$","X", levels(df$column1))

чтобы соответствовать точно "A", а не "CAB" или что-то еще с капиталом A.