您可以创建一组要判断的规则.
tidyverse
approach
当你使用dplyr
,让我们全力以赴:
(rules <- glue::glue('"{lbl}" ~ "{val}"', lbl = names(lbls), val = lbls))
# "male" ~ "Man"
# "female" ~ "Woman"
然后,您可以将此字符向量转换为call
个对象的列表,其中包含rlang::parse_exprs()
个对象.然后使用splice operator,!!!
:
starwars |>
select(sex) |>
mutate(
sex = case_match(
sex,
!!!rlang::parse_exprs(rules),
.default = sex
)
)
# # A tibble: 87 × 1
# sex
# <chr>
# 1 Man
# 2 none
# 3 none
# 4 Man
# 5 Woman
# 6 Man
# 7 Woman
# 8 none
# 9 Man
# 10 Man
# # ℹ 77 more rows
# # ℹ Use `print(n = ...)` to see more rows
R基方法
我们也可以在R基中进行解析和拼接.对我来说,这就更清楚了,我们可以用sprintf()
来定义规则,而不是像蔡仁(Darren Tsai)建议的glue
.
rules <- c(
"sex",
sprintf('"%s" ~ "%s"', names(lbls), lbls)
)
为了将字符向量转换成语言对象列表,我们可以使用str2lang()
而不是parse_exprs()
.然后!!!
是将case_match()
应用于参数列表的一种方式,即等同于do.call()
.
starwars |>
select(sex) |>
mutate(
sex = do.call(
case_match,
c(
lapply(rules, str2lang),
list(.default = sex)
)
)
)
# # A tibble: 87 × 1
# sex
# <chr>
# 1 Man
# 2 none
# 3 none
# 4 Man
# 5 Woman
# <etc>
A note on .default
注意,与recode
不同,我们需要提供.default
参数:
当.x
中的值与任何LHS输入都不匹配时使用的值.如果是默认值NULL
,则将使用缺失值.
如果不提供,则任何未指定的值(例如"none"
)变为NA