获取所有分组组合的摘要,例如 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)
}
}
此代码将输出我想要的三个变量和加权平均值,但添加更多变量或更多汇总函数是微不足道的。
(我明白我的问题等同于这个问题: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)
}
}
此代码将输出我想要的三个变量和加权平均值,但添加更多变量或更多汇总函数是微不足道的。