r - 如何生成具有可能出现在多个列中的分组值的汇总表?
问题描述
如果分组值可以出现在两列或多列中,是否存在生成汇总数据的最佳实践?
请考虑以下数据:
df<-data.frame(Age=c(1,1,1,1,1,2,2,2,2,2),
Score=c(1,2,1,2,1,2,1,2,1,2),
Major=c("Art","Art","Art","Math","Math","Science","Science","Science","Science","Science"),
Major_2=c("Math","Knitting","Math","Science","Science","Knitting","Lava","Knitting","Lava","Knitting"))
我想为每个专业的人制作一个汇总统计表,但是每个人(由表中的一行表示)可能有多个专业,而对于两个主要列中的哪一个包含给定的没有任何要求价值。
如果专业存在于一个专栏中,我会接近dplyr
并产生
df_summary<-df%>%
group_by(Major)%>%
summarize(Avg_Age=mean(Age),
Total_Score=sum(Score))
我想要的结果是:
我可以使用下面的代码得到这个结果,但是有没有更容易阅读或者更有效的解决方案?
##gathering all the possible majors
majors<-unique(c(df$Major,df$Major_2))
##creating a list
answer<-list()
##looping through each major and summarizing
for (maj in majors) {
answer[[maj]]<-df%>%
filter(Major==maj |Major_2==maj)%>%
summarize(Major=maj,
Avg_Age=mean(Age),
Total_Score=sum(Score))
}
##binding back into the desired table, with a row for each major
awkward_answer<-bind_rows(answer)
解决方案
您可以使用tidyr::pivot_longer
library(tidyr)
library(dplyr)
df %>%
pivot_longer(Major:Major_2, values_to = "Major") %>%
group_by(Major) %>%
summarise(Avg_Age = mean(Age),
Total_Score = sum(Score))
# A tibble: 5 x 3
Major Avg_Age Total_Score
<chr> <dbl> <dbl>
1 Art 1 4
2 Knitting 1.75 8
3 Lava 2 2
4 Math 1 5
5 Science 1.71 11
推荐阅读
- python - 满足条件后返回文本文件中的指定行
- flutter - 如何将数据从扩展 DataTableSource 类传递到 StateFull 类
- javascript - 如何使用 asyncStorage 从本地存储中获取值并返回
- bash - 使用文件名中的日期格式删除早于 X 天的文件
- python - 如何计算每行具有动态条件的 Pandas df 元素(=countif)
- r - 自动将 y 轴文本和网格线对齐到 ggplot 的底部和顶部
- amazon-web-services - 如何配置 Fluentd 转发器以将日志流式传输到连接到 EC2 实例的负载均衡器
- nginx - nginx将最后一个斜杠重写为无斜杠
- javascript - formData object Uncaught TypeError: 非法调用
- java - 如何将 c:forEach 与 arrayList 一起使用?