获取所有分组组合的摘要,例如 SAS 中的 proc 摘要

Get a summary for all combinations of grouping like proc summary in SAS

(我明白我的问题等同于这个问题:R function equivalent to proc summary in SAS 但是作为新用户,我无法评论解决方案以询问详细信息或解释,而且我无法使它们中的任何一个起作用。)

我正在尝试将脚本从 SAS 转换为 R。objective 是为了跨多个变量获取数据库的广泛摘要。

起始基地是这样的:

Student ID Flag1 Flag2 Flag3 other flags... weight score
code1 level1 A first smth~~ 2 12
code23 level5 C third smth~else~ 3 9

最后我想要这样的东西:

Flag1 Flag2 Flag3 other flags... nb of students weighted mean std dev min 1st quartile ... max nb of students in fist decile ... nb of students in last decile
level1 A first smth~~ 5 10.96 1.5 1 ... ... ... ... ... ...
level5 .All third smth~else~ 1500 8.70 2.7 3 ... ... ... ... ... ...

在 SAS 中,这真的很容易,因为 proc summary 对每个可能的分组组合进行汇总,但在 R 中,您只能获得最低级别的分组。 有 9 个不同级别的分组,即 512 种组合,我认为应该有一种方法可以循环一些工作。

以下是我认为应该如何进行:

1- 列出数据框中的所有不同组合:

Flag1 Flag2 Flag3
.All .All .All
.All .All first
.All .All second
.All A .All
.All B .All
LV1 .All .All
LV2 .All .All
.All A first
.All A second
.All B first
.All B second
LV1 .All first
LV1 .All second
LV2 .All first
LV2 .All second
LV1 A .All
LV1 B .All
LV2 A .All
LV2 B .All
LV1 A first
LV1 A second
LV1 B first
LV1 B second
LV2 A first
LV2 A second
LV2 B first
LV2 B second

2- 制作一个 2^n 长度的循环,将调用以下函数:

3- 该函数将从最后一个数据帧中取出一行,然后输出一个数据帧,该数据帧将包含按一些变量+列的汇总分组,所有用于不用于分组的变量

4- 使用 bind_rows

将循环的每次迭代堆叠在一起

我在解决这个问题时遇到了多个障碍,但我最终得到了一个令人满意的解决方案:

#import the data
testbase <- read_excel("testbase.xlsx")
#list all the grouping variables
variables = c(quo(Flag1), quo(Flag2),quo(Flag3))
#create the powerset of the list of variables
listevars=powerSet(variables,length(variables),rev=FALSE)

for (i in 1:length(listevars)){
  testbase=ungroup(testbase)
  if (length(listevars[[i]])!=0){
    testbase=group_by(testbase,!!!listevars[[i]])
  }
  resumepartiel=summarize(testbase,weighted.mean(score,weight))
  varexcl=variables[!(variables %in% listevars[[i]])]
  if (length(varexcl)!=0){
    for(j in 1:length(varexcl)){
      colonne=data.frame(c(rep(".All",times = nrow(resumepartiel))))
      colonne=setNames(colonne,as_name(varexcl[[j]]))
      resumepartiel=bind_cols(colonne,resumepartiel)
    }
  }
  if(i==1){
    resume=resumepartiel
  }
  else{
    resume=bind_rows(resume,resumepartiel)
  }
}

此代码将输出我想要的三个变量和加权平均值,但添加更多变量或更多汇总函数是微不足道的。