dplyr包中,recode()被取代,而case_match()被取代.有没有一种方法可以使用存储在char数组中的标签来使用case_match()重新编码值?

例如,使用recode(),我可以将标签存储在char数组中(或从CSV文件中读取),并使用它们进行重新编码:

lbls <- c(
    'male' = 'Man',
    'female' = 'Woman'
)

starwars %>%
    select( sex ) %>%
    mutate(
        sex = recode( sex, !!!lbls )
    )

# A tibble: 87 × 1
#   sex  
#   <chr>
# 1 Man  
# 2 none 
# 3 none 
# 4 Man  
# 5 Woman
# ...

然而,由于case_match()需要双边公式(old_values ~ new_value),这不起作用.是否有一种方法可以在case_match()中使用存储值?

推荐答案

您可以创建一组要判断的规则.

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

R相关问答推荐

R gtsummary tBL_summary,包含分层和两个独立分组变量

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

在ggplot Likert条中添加水平线

使用ggplot将平滑线添加到条形图

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

名称输出pmap on tible

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

如何在geom_col中反转条

从所有项的 struct 相同的两级列表中,将该第二级中的所有同名项绑定在一起

根据类别合并(汇总)某些行

SHINY:使用JS函数应用的CSS样式显示HTML表格

列名具有特殊字符时的循环回归

停止ggplot将多行减少到一行

在gggraph中显示来自不同数据帧的单个值

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

如何在GALT包的函数&geom_x样条线中调整线宽

R-找出存在其他变量的各种大小的所有组合

使用LAG和dplyr执行计算,以便按行和按组迭代

Broom.Mixed::Augment不适用于Sample::分析