dplyr :: recode_factor с априори неизвестными уровнями - PullRequest
0 голосов
/ 22 мая 2018

Я ищу способ применения dplyr recode_factor, когда уровень, который я хочу изменить, не известен заранее.Например, я хотел бы применить cut(5) к столбцу и настроить первый уровень (interval), чтобы он начинался с 0.

set.seed(42)

library(dplyr)
library(stringr)

x <- rgamma(100, 1)
x_cut <- x %>% cut(5)
old_level <- levels(x_cut)[[1]]
new_level <- old_level %>% str_extract_all("[0-9]+\\.([0-9]+)",simplify=TRUE) %>% `[`(2) %>% paste0("(0,",.,"]")
x_cut %>% recode_factor( old_level = new_level) %>% levels

, но это, похоже, не работает.

Я ожидаю увидеть

[1] "(0,1.38]" "(1.38,2.75]"    "(2.75,4.12]"    "(4.12,5.49]"    "(5.49,6.87]"

, но ничего не изменилось, и я получаю

[1] "(0.00388,1.38]" "(1.38,2.75]"    "(2.75,4.12]"    "(4.12,5.49]"    "(5.49,6.87]"

1 Ответ

0 голосов
/ 22 мая 2018

Левая часть вашей пары перекодирования old_level = new_level должна оцениваться вместо кавычек.

Используйте синтаксис !! и :=, чтобы сделать это:

x_cut %>% recode_factor(!!old_level := new_level) %>% levels

Например, с set.seed(42):

x_cut
#  "(0.00388,1.38]" "(1.38,2.75]" "(2.75,4.12]" "(4.12,5.49]" "(5.49,6.87]"   
old_level
#  "(0.00388,1.38]"
new_level
#  "(0,1.38]"
x_cut %>% recode_factor(!!old_level := new_level) %>% levels
#  "(0,1.38]" "(1.38,2.75]" "(2.75,4.12]" "(4.12,5.49]" "(5.49,6.87]"

См. dplyr programming docs для более подробной информации о !! ("bang bang").

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