Переименуйте один уровень фактора в 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.