Как я могу использовать подфункцию в R, чтобы изменить уровень фактора, который имеет символ плюс (+)?

Я столкнулся с ошибкой, используя функции sub() и gsub() в R, чтобы переименовать / изменить уровень фактора в R. Но я не уверен, почему он не работает.

Сценарий: у меня есть некоторые данные опроса, которые несколько факторов с уровнями, которые усекают высокое значение. Например, вопрос о том, сколько часов вы работали на прошлой неделе, останавливается на отметке "89 + часов". Я хочу изменить этот уровень на "89", чтобы использовать его численно для других видов деятельности. Я знаю несколько способов сделать это - поэтому мне не нужны различные другие варианты изменения уровня.

Я следовал инструкциям по использованию функций sub() и gsub() с этого сайта: http://www.cookbook-r.com/Manipulating_data/Renaming_levels_of_a_factor/ Концепция ясна и проста.

Вот исходные данные примера:

x <- factor(c("a", "b", "c", "d"))
x
[1] a b c d
Levels: a b c d

Я могу изменить уровень D до уровня 89

x <- factor(c("a", "b", "c", "d"))
levels(x) <- sub("d", "89", levels(x))
x
[1] a b c 89
Levels: a b c 89

Я в порядке, когда я ввожу пробел в уровне:

x <- factor(c("a", "b", "c", "d"))
levels(x) <- sub("d", "89 hrs", levels(x))
x
[1] a b c 89 hrs
Levels: a b c 89 hrs

Я в порядке, когда я добавляю символ + на новый уровень фактора:

x <- factor(c("a", "b", "c", "d"))
levels(x) <- sub("d", "89+ hrs", levels(x))
x
[1] a b c 89+ hrs
Levels: a b c 89+ hrs 

Но я застреваю, когда пытаюсь переименовать / изменить уровень с символом + на один без него:

x <- factor(c("a", "b", "c", "89+ hrs"))
x
[1] a b c 89+ hrs
Levels:89+ hrs a b c

levels(x) <- sub("89+ hrs", "d", levels(x))
x
[1] a b c 89+ hrs
Levels: 89+ hrs a b c

Та же проблема, когда я включаю конкретный пример строки со связанного сайта:

levels(x) <- sub("^89+ hrs$", "d", levels(x))
x
[1] a b c 89+ hrs
Levels: 89+ hrs a b c

Я получаю ту же проблему, если я использую gsub() вместо sub().

Проблема также возникает, если у меня есть * вместо +, но работает, если это точка (.) Вместо +. Поэтому я думаю, что это связано с определенными специальными персонажами, но не с другими.

Любые мысли, почему это не работает с символом + и как я могу использовать эти функции? Заранее спасибо!

2 ответа

Решение

sub() функция использует регулярные выражения по умолчанию и + это специальный символ для регулярных выражений. Если вы хотите сопоставить буквальный знак плюс, используйте

levels(x) <- sub("89\\+ hrs", "d", levels(x))

или же

levels(x) <- sub("89+ hrs", "d", levels(x), fixed=TRUE)

Ничто об этом не является уникальным для факторов. Это просто как sub() работает с любым вектором символов и levels() просто случается вернуть символьный вектор.

Удобный вариант fct_recode от forcats

library(forcats)
fct_recode(x, d = "89+ hrs")
#[1] a b c d
#Levels: d a b c

данные

x <- factor(c("a", "b", "c", "89+ hrs"))
Другие вопросы по тегам