aggregate | 在R中进行分组统计

简介: aggregate | 在R中进行分组统计

aggregate 的简单用法指南


分组求均值


#导入内置数据
df <- chickwts
#查看数据集
head(df)
> head(df)
  weight      feed
1    179 horsebean
2    160 horsebean
3    136 horsebean
4    227 horsebean
5    217 horsebean
6    168 horsebean

aggregate分组计算均值有两种方法。


法1:

#第一个参数:数值变量
#第二个参数:列表形似的分组变量
#第三个参数:用于汇总统计的函数(本例为均值mean)
group_mean <- aggregate(df$weight, list(df$feed), mean)
> group_mean
    Group.1        x
1    casein 323.5833
2 horsebean 160.2000
3   linseed 218.7500
4  meatmeal 276.9091
5   soybean 246.4286
6 sunflower 328.9167

值得注意的是,数据框的列名发生了改变,可以使用colnames函数修改。

colnames(group_mean) <- c("Group", "Mean")
group_mean


> group_mean
Group     Mean
1    casein 323.5833
2 horsebean 160.2000
3   linseed 218.7500
4  meatmeal 276.9091
5   soybean 246.4286
6 sunflower 328.9167

法2:

group_mean <- aggregate(weight ~ feed, data = df, mean)
> group_mean
       feed   weight
1    casein 323.5833
2 horsebean 160.2000
3   linseed 218.7500
4  meatmeal 276.9091
5   soybean 246.4286
6 sunflower 328.9167

分组统计个数


group_count <- aggregate(df$feed, by = list(df$feed), FUN = length)
group_count
> group_count
    Group.1  x
1    casein 12
2 horsebean 10
3   linseed 12
4  meatmeal 11
5   soybean 14
6 sunflower 12

分组统计总体分位数


#建立一个数据集:一个基金的一年的每日收益
set.seed(1)
library(lubridate)
Dates <- seq(dmy("01/01/2014"), dmy("01/01/2015"), by = "day")
Return <- rnorm(length(Dates))
install.packages("xts")
library(xts)
tserie <- xts(Return, Dates)
head(tserie)
> head(tserie)
                 [,1]
2014-01-01 -0.6264538
2014-01-02  0.1836433
2014-01-03 -0.8356286
2014-01-04  1.5952808
2014-01-05  0.3295078
2014-01-06 -0.8204684

可以计算每个月收益的5%和95%的分位数:

dat <- aggregate(tserie ~ month(index(tserie)), FUN = quantile,
                 probs = c(0.05, 0.95))
colnames(dat)[1] <- "Month"
dat
> dat
   Month     V1.5%    V1.95%
1      1 -1.704122  1.427575
2      2 -1.099533  1.316474
3      3 -1.388600  1.819083
4      4 -1.083452  1.639272
5      5 -1.652789  1.259811
6      6 -1.406464  2.147217
7      7 -1.337666  1.637731
8      8 -1.669366  1.308261
9      9 -1.635192  1.155433
10    10 -1.371251  1.874883
11    11 -1.445358  1.505385
12    12 -2.091900  1.525886

按多个列聚合

#创建数据集
set.seed(1)
cat_var <- sample(c("A", "B", "C"), nrow(df), replace = TRUE)
df_2 <- cbind(df, cat_var)
head(df_2)
> head(df_2)
  weight      feed cat_var
1    179 horsebean       A
2    160 horsebean       C
3    136 horsebean       A
4    227 horsebean       B
5    217 horsebean       A
6    168 horsebean       C

可以根据多个分类变量进行统计

aggregate(df_2$weight, by = list(df_2$feed, df_2$cat_var), FUN = sum)
aggregate(weight ~ feed + cat_var, data = df_2, FUN = sum) #等效
feed   cat_var  weight
    casein      A     1005
 horsebean      A      532
   linseed      A     1079
  meatmeal      A      242
   soybean      A     1738
 sunflower      A      882
    casein      B     1131
 horsebean      B      494
   linseed      B      780
  meatmeal      B     2244
   soybean      B     1355
 sunflower      B     2109
    casein      C     1747
 horsebean      C      576
   linseed      C      766
  meatmeal      C      560
   soybean      C      357
 sunflower      C      956
#创建一个新数据集
set.seed(1)
num_var <- rnorm(nrow(df))
df_3 <- cbind(num_var, df)
head(df_3)
> head(df_3)
     num_var weight      feed
1 -0.6264538    179 horsebean
2  0.1836433    160 horsebean
3 -0.8356286    136 horsebean
4  1.5952808    227 horsebean
5  0.3295078    217 horsebean
6 -0.8204684    168 horsebean

处理两个或多个数值变量时,可以使用cbind函数来连接:

aggregate(cbind(df_3$num_var, df_3$weight), list(df_3$feed), mean)
Group.1       V1       V2
    casein   0.4043795  323.5833
 horsebean   0.1322028  160.2000
   linseed   0.3491303  218.7500
  meatmeal   0.2125804  276.9091
   soybean  -0.2314387  246.4286
 sunflower   0.1651836  328.9167

当然,还可以将该函数同时应用于多个数值变量和分类变量。


参考

https://r-coder.com/aggregate-r/


相关文章
|
27天前
如何优雅地对数据进行分组?
如何优雅地对数据进行分组?
26 0
|
5月前
使用lamba中stream 进行分组统计
使用lamba中stream 进行分组统计
|
5月前
|
SQL 搜索推荐 数据库
8. 聚合查询
8. 聚合查询
|
11月前
DQL-分组聚合
DQL-分组聚合
28 0
|
关系型数据库
分组
GROUP BY 语句根据一个或多个列对结果集进行分组。
|
SQL 存储 关系型数据库
group by聚合小技巧
group by聚合小技巧
76 0
|
SQL 分布式计算 Java
聚合操作_groupBy_聚合操作 | 学习笔记
快速学习聚合操作_groupBy_聚合操作
128 0
聚合操作_groupBy_聚合操作 | 学习笔记
聚合查询易忽略的点
聚合查询易忽略的点
76 0
|
SQL 索引
基于ES之业务数据分组求和TopN开发
需求:把作家所有作品的总点击数加起来求和再进行排序的一个实现
基于ES之业务数据分组求和TopN开发
|
分布式计算 Spark
【Spark 应用】实现分组取topN
【Spark 应用】实现分组取topN
200 0