2015-04-29 5 views
16

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

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

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

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

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

Можно ли направить меня правильный подход?

ответ

20

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

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'") 
+0

Это лучшее, что я мог бы придумать. Это один из тех случаев, когда индексирование R действительно не очень аккуратно. – thelatemail

+0

Спасибо! Первый вариант работал отлично. – user3949312

5

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

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

и теперь мы заменим «А» с «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)) 

, чтобы точно соответствовать «А», а не «САВ» или что-то еще с большой буквы А.

+2

'gsub' здесь немного рискован. Что делать, если у вас были уровни «A» и «Ajax»? – thelatemail

+0

@thelatemail Я делал это редактирование, как вы прокомментировали. – MrFlick

 Смежные вопросы

  • Нет связанных вопросов^_^