Как я могу использовать подфункцию в 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"))