在R函数中为pivot_wider()的names_glue参数使用双大括号{{}}
解决R函数中pivot_wider的names_glue变量替换问题
默认情况下,tidyr::pivot_wider()生成的列名会把values_from的取值放在前面(比如n_Party A),而你需要将names_from的列取值作为前缀(比如Party A_n),这样排序后每个党派的绝对数和百分比列会相邻显示。你在函数中尝试用双大括号{{}}处理names_glue参数时出现了错误,核心问题是混淆了函数参数变量名和names_from列的实际取值。
解决方案
在pivot_wider()的names_glue参数中,不需要使用{{parties}},而是直接用内置的glue变量:
{.name}:对应names_from指定列的每一个取值(比如Party A、Party B){.value}:对应values_from指定的每一个元素(比如n、per)
修改后的完整代码如下:
# 创建示例数据集 Datensatz <- data.frame(Kandidat= c("Candidate A", "Candidate B", "Candidate C", "Candidate D"), Partei = c("Party A", "Party B", "Party A", "Party C"), Geschlecht = c("Male", "Female", "Female", "Female")) # 修改后的统计函数 stats_sociodem <- function(data, var, parties){ # 整体统计 sv_stats_all <- data %>% group_by({{var}}) %>% summarise(all_n = n()) %>% mutate(all_per = prop.table(all_n) * 100) # 分党派统计 sv_stats <- data %>% group_by({{var}}, {{parties}}) %>% summarise(n = n(), .groups = "drop_last") %>% # 显式处理分组,避免警告 mutate(per = prop.table(n) * 100) %>% pivot_wider(names_from = {{parties}}, values_from = c("n", "per"), names_glue = "{.name}_{.value}" # 用{.name}指代党派名称取值 ) %>% select({{var}}, sort(names(.))) # 按字母顺序排列列 # 合并整体统计结果,用as_label简化变量名获取 sv_stats_final <- left_join(sv_stats, sv_stats_all, by = rlang::as_label({{var}})) sv_stats_final } # 调用函数示例 stats_sociodem(Datensatz, Geschlecht, Partei)
关键修改说明
- 核心调整:将
names_glue改为"{.name}_{.value}",自动把党派名称作为前缀,拼接统计类型(n/per),实现你需要的列名格式 - 添加
.groups = "drop_last":在summarise中显式指定分组处理逻辑,避免R版本更新带来的分组残留警告 - 替换变量名获取方式:用
rlang::as_label({{var}})替代deparse(substitute(var)),更符合tidyeval语法规范
运行结果示例
# A tibble: 2 × 8 Geschlecht `Party A_n` `Party A_per` `Party B_n` `Party B_per` `Party C_n` `Party C_per` all_n all_per <chr> <int> <dbl> <int> <dbl> <int> <dbl> <int> <dbl> 1 Female 1 50 1 100 1 100 3 75 2 Male 1 100 0 0 0 0 1 25
可以看到,列名已调整为Party A_n、Party A_per的格式,排序后每个党派的绝对数和百分比列相邻显示,完全符合需求。
内容的提问来源于stack exchange,提问作者marina
相关产品推荐
相关产品推荐

