在R函数中pivot_wider()的参数names_glue中使用Curly-Curly {{}}

uoifb46i  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(42)

大家好,提前感谢您的回复。
默认情况下,R中的tidyr::pivot_wider()创建新的列名,后缀中的值来自“names_from”。这可以通过包含“names_glue = {var 1}_{var 2}"-参数来更改(如这里所示:R: Changing column names in pivot_wider() -- suffix to prefix)。然而,由于我试图在函数中使用pivot_wider,我无法弄清楚如何将此参数应用于curly-curly-variable(参见下面的示例)。
我需要以这种方式重命名列,以便稍后可以按顺序重新排序列,以便首先显示甲方的绝对数字和百分比列,然后显示乙方的绝对数字和百分比列,等等(而不是首先显示所有绝对数字,然后再显示所有百分比)。
范例:我有一个政治候选人的数据集,他们的政党联盟和他们的社会人口信息。总体和每个政党有多少男性/女性(绝对和相对)?

# Create example data frame:
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"))
Datensatz

# My current function code:
stats_sociodem <- function(data, var, parties){

  # Create tables for statistics overall
  sv_stats_all <- data %>%
    group_by({{var}}) %>%
    summarise(all_n = n()) %>%
    mutate(all_per = prop.table(all_n) * 100)

  # Create table for statistics grouped by parties
  sv_stats <- data %>%
    group_by({{var}}, {{parties}}) %>%
    summarise(n = n()) %>%
    group_by({{parties}}) %>%
    mutate(per = prop.table(n) * 100) %>%
    pivot_wider(names_from = {{parties}},
                values_from = c("n", "per"),
                names_glue = "{{{parties}}}_{.value}"
                ) %>%
    select({{var}}, sort(names(.)))

  # Join
  var_name <- deparse(substitute(var))
  sv_stats_final <- left_join(sv_stats, sv_stats_all, by=var_name)
sv_stats_final
}

# Application example for gender statistics:
stats_sociodem(Datensatz, Geschlecht, Partei)

字符串
也许我可以使用正则表达式,但不确定。

bqjvbblv

bqjvbblv1#

当你在下面使用deparse(substitute())时,你已经暗示了一个解决方案。

library(tidyverse)

# My current function code:
stats_sociodem <- function(data, var, parties){
  
  # Create tables for statistics overall
  sv_stats_all <- data %>%
    group_by({{var}}) %>%
    summarise(all_n = n()) %>%
    mutate(all_per = prop.table(all_n) * 100)
  
  parties_name <- deparse(substitute(parties)) # New
  
  # Create table for statistics grouped by parties
  sv_stats <- data %>%
    group_by({{var}}, {{parties}}) %>%
    summarise(n = n()) %>%
    group_by({{parties}}) %>%
    mutate(per = prop.table(n) * 100) %>%
    pivot_wider(names_from = {{parties}},
                values_from = c("n", "per"),
                names_glue = paste0("{", parties_name, "}_{.value}") # New
    ) %>%
    select({{var}}, sort(names(.)))
  
  # Join
  var_name <- deparse(substitute(var))
  sv_stats_final <- left_join(sv_stats, sv_stats_all, by=var_name)
  sv_stats_final
}

# Application example for gender statistics:
stats_sociodem(Datensatz, Geschlecht, Partei)

字符串

相关问题