Добавить новый уровень к фактору и заменить существующий - PullRequest
6 голосов
/ 27 октября 2011

У меня большие проблемы при работе с именами уровней фрейма данных.

У меня большой фрейм данных, в котором один из столбцов является фактором с МНОЖЕСТВОМ уровней.

Проблема в том, что некоторые из этих данных дублируются, и следующий шаг в моем анализе не принимает дублированные данные.Поэтому мне нужно изменить имя дублированного уровня, чтобы я мог перейти к следующему шагу.

Позвольте привести небольшой пример:

Скажем, у нас есть этот простой фрейм данных с однимcolum:

> df
col_foo
1   bar1
2   bar2
3   bar3
4   bar2
5   bar4
6   bar5
7   bar3

Если мы посмотрим на столбец, мы увидим, что это фактор с пятью различными уровнями.

>df$col_foo
[1] bar1 bar2 bar3 bar2 bar4 bar5 bar3
Levels: bar1 bar2 bar3 bar4 bar5

Хорошо, проблема наступает сейчас.Посмотрите, что уровни bar2 и bar3 дублированы .Что я хочу знать, так это как я могу добавить имя уровня, например bar2_X, и заменить на него только дублированный.Таким образом, датафрейм должен стать таким:

> df
col_foo
1   bar1
2   bar2
3   bar3
4   bar2_X
5   bar4
6   bar5
7   bar3_X

Возможно ли это?Я не могу изменить класс столбца, это все равно должно быть фактором, поэтому решения, для которых необходимо изменить его, не решат мою проблему, если не удастся снова привести к фактору.

Спасибо

Ответы [ 3 ]

10 голосов
/ 27 октября 2011

Позвоните make.names с unique = TRUE в вашей колонке.

df$col_foo <- factor(make.names(df$col_foo, unique = TRUE))
4 голосов
/ 27 октября 2011

Если вы хотите, чтобы все записи были уникальными, то фактор не сильно выигрывает, если вы просто используете символьную переменную.

Вероятно, самый простой способ сделать то, что вы хотите, - это привести к вектору символов, использовать функцию duplicated, чтобы найти дубликаты и вставить что-то в их конец, а затем, если вы хотите использовать factor, чтобы восстановить вернуться к фактору. Возможно что-то вроде:

df$col_foo <- factor( ifelse( duplicated(df$col_fo), 
                    paste(df$col_foo, '_x', sep=''), as.character(df$col_foo)))
3 голосов
/ 05 октября 2016

Вы можете редактировать уровни переменной фактора:

levels(df$col_foo) <- c(levels(df$col_foo),"bar2_X","bar3_X")

и затем изменять повторяющиеся уровни на один из новых добавленных вами уровней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...