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

Я столкнулся с ошибкой, используя функции 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 ]

0 голосов
/ 06 февраля 2019

Удобной опцией является fct_recode из forcats

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

data

x <- factor(c("a", "b", "c", "89+ hrs"))
0 голосов
/ 06 февраля 2019

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

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

или

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

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

...