【问题标题】:group_by(across(all_of(vars, YEARS))) - grouping by variables with a fixed YEAR variablegroup_by(across(all_of(vars, YEARS))) - 按具有固定 YEAR 变量的变量分组
【发布时间】:2021-06-13 12:17:30
【问题描述】:

我有一些数据想总结一下。我想总结所有列,保持 YEAR 列固定。即对于一个变量我可以做:

df %>% 
  group_by(LG1, YEAR) %>% 
  summarise(Freq = n())

但是,我想在每个变量中执行此操作。以下内容无法按我的意愿工作,因为它没有按 YEAR 变量分组。我试图包含 group_by(across(all_of(c(vars, YEAR)))) %>%,它返回一个错误。

vars <- c("LG1", "AA1", "FNB1", "RE1", "PE1", "LG2", "AA2", "FNB2", "RE2", "PE2", "LG3", "AA3", "FNB3", "RE3", "PE3")
df %>% 
  select(c(all_of(vars), "YEAR")) %>% 
  group_by(across()) %>% 
  summarise(Freq = n())

预期输出将是一个数据框,其中包含每个变量的频率(按年份)。

数据:

df <- structure(list(ï..N.QUESTIONAIRE = c(119L, 122L, 137L, 59L, 121L, 
19L, 50L, 40L, 124L, 108L, 26L, 193L, 94L, 27L, 49L, 82L, 149L, 
88L, 133L, 150L, 5L, 28L, 175L, 91L, 151L, 97L, 70L, 42L, 21L, 
155L), LG1 = c(4L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 3L, 4L, 5L, 
4L, 4L, 4L, 5L, 4L, 4L, 5L, 4L, 5L, 4L, 4L, 3L, 5L, 5L, 5L, 3L, 
3L, 3L), AA1 = c(1L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 4L, 3L, 3L, 
1L, 1L, 3L, 2L, 1L, 1L, 3L, 1L, 3L, 1L, 2L, 3L, 2L, 2L, 2L, 2L, 
2L, 4L, 1L), FNB1 = c(4L, 4L, 5L, 4L, 4L, 4L, 4L, 4L, 3L, 4L, 
4L, 5L, 4L, 4L, 4L, 5L, 4L, 4L, 4L, 5L, 5L, 4L, 4L, 4L, 5L, 2L, 
5L, 4L, 3L, 4L), RE1 = c(2L, 3L, 1L, 2L, 1L, 3L, 3L, 2L, 1L, 
3L, 3L, 4L, 1L, 2L, 3L, 2L, 2L, 2L, 3L, 4L, 2L, 2L, 3L, 2L, 5L, 
3L, 1L, 2L, 2L, 3L), PE1 = c(5L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 
4L, 5L, 4L, 5L, 4L, 4L, 5L, 5L, 5L, 4L, 5L, 5L, 5L, 4L, 5L, 4L, 
5L, 4L, 4L, 4L, 4L, 4L), LG2 = c(4L, 3L, 5L, 5L, 2L, 4L, 3L, 
3L, 4L, 3L, 2L, 5L, 3L, 3L, 2L, 5L, 5L, 5L, 4L, 4L, 1L, 5L, 2L, 
4L, 1L, 5L, 5L, 4L, 4L, 5L), AA2 = c(4L, 5L, 5L, 4L, 3L, 4L, 
5L, 3L, 5L, 4L, 5L, 5L, 5L, 2L, 5L, 5L, 5L, 4L, 5L, 5L, 5L, 4L, 
3L, 5L, 5L, 5L, 5L, 5L, 4L, 4L), FNB2 = c(1L, 2L, 1L, 2L, 3L, 
1L, 3L, 3L, 1L, 1L, 3L, 2L, 1L, 3L, 2L, 3L, 2L, 2L, 1L, 2L, 1L, 
2L, 2L, 3L, 5L, 1L, 3L, 3L, 2L, 1L), RE2 = c(4L, 3L, 3L, 3L, 
3L, 4L, 3L, 3L, 4L, 3L, 2L, 5L, 4L, 3L, 4L, 4L, 5L, 3L, 2L, 2L, 
4L, 2L, 4L, 1L, 5L, 5L, 4L, 1L, 3L, 4L), PE2 = c(2L, 4L, 1L, 
3L, 3L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 4L, 
1L, 1L, 2L, 2L, 4L, 1L, 1L, 2L, 4L, 1L, 1L), LG3 = c(4L, 3L, 
3L, 4L, 2L, 4L, 4L, 2L, 5L, 3L, 3L, 4L, 4L, 2L, 4L, 3L, 3L, 4L, 
4L, 3L, 5L, 4L, 4L, 2L, 5L, 5L, 3L, 4L, 5L, 4L), AA3 = c(1L, 
3L, 2L, 2L, 3L, 3L, 2L, 1L, 1L, 2L, 2L, 3L, 3L, 2L, 1L, 1L, 1L, 
3L, 2L, 3L, 1L, 1L, 4L, 2L, 4L, 4L, 1L, 1L, 3L, 2L), FNB3 = c(5L, 
5L, 5L, 5L, 5L, 2L, 4L, 4L, 5L, 4L, 5L, 5L, 4L, 4L, 5L, 5L, 5L, 
4L, 5L, 5L, 5L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), RE3 = c(2L, 
2L, 2L, 2L, 3L, 4L, 4L, 2L, 3L, 3L, 3L, 1L, 1L, 2L, 3L, 2L, 1L, 
4L, 4L, 1L, 3L, 1L, 1L, 3L, 5L, 1L, 2L, 4L, 3L, 2L), PE3 = c(5L, 
3L, 4L, 4L, 4L, 4L, 3L, 4L, 5L, 5L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 
4L, 4L, 4L, 5L, 4L, 4L, 3L, 5L, 5L, 4L, 3L, 4L, 3L), YEAR = c(2L, 
2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 
1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 2L), NATIONALITY = c(2L, 
2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 3L, 1L, 2L, 1L, 1L, 
3L, 1L, 1L, 2L, 2L, 2L, 3L, 1L, 3L, 1L, 2L, 3L, 1L), GENDER = c("F", 
"F", "M", "M", "F", "M", "M", "F", "F", "M", "F", "M", "M", "F", 
"M", "F", "F", "F", "M", "F", "M", "F", "M", "M", "F", "M", "M", 
"F", "M", "F"), AGE = c(1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 3L, 
1L, 3L, 3L, 2L, 2L, 3L, 2L, 3L, 1L, 2L, 1L, 2L, 2L, 3L, 2L, 3L, 
2L, 2L, 1L, 2L)), class = "data.frame", row.names = c(NA, -30L
))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以在group_by 中使用across 来包含所有vars 列以及YEAR

    library(dplyr)
    
    df %>%  group_by(across(c(all_of(vars), "YEAR"))) %>% summarise(Freq = n())
    

    我们也可以在这里使用count -

    df %>% count(across(c(all_of(vars), "YEAR")))
    

    如果您想为vars 中的每个值使用count,您可以使用map

    purrr::map(vars, ~df %>% count(YEAR, .data[[.x]]))
    

    【讨论】:

    • 谢谢!但是我们需要删除Freq = 部分吗?它创建了一个额外的列,我假设频率将显示在每个列下。
    • 你期待这样的输出吗? purrr::map(vars, ~df %&gt;% count(YEAR, .data[[.x]]))
    • 我期望计算两个年份的每个变量的频率数,因此在第 1 年有频率,在第 2 年有频率。我认为purrrr 方法给了我想要的东西。
    【解决方案2】:

    我们还可以将YEAR 指定为count 中的未引用

    library(dplyr)
    df %>%
         count(across(c(all_of(vars), YEAR)))
    

    或者另一种选择是转换为symbols 然后评估(!!!

    df %>%
         group_by(!!! rlang::syms(vars), YEAR) %>%
         summarise(Freq = n(), .groups = 'drop')
    

    count 中的类似选项

    df %>%
         count(!!! rlang::syms(vars), YEAR)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      相关资源
      最近更新 更多