R语言 如何按组获得汇总统计数据
在这篇文章中,我们将学习如何在R编程语言中按组获得汇总统计数据。
使用中的数据框架样本
grpBy num
1 A 20
2 A 30
3 A 40
4 B 50
5 B 50
6 C 70
7 C 80
8 C 25
9 C 35
10 D 45
11 E 55
12 E 65
13 E 75
14 E 85
15 E 95
16 E 105
方法1:使用 tapply( )
R语言中的 tapply() 函数 用于在一个由因子组合给出的向量子集上应用一个函数。根据语法,这个函数需要3个参数。第一个参数是数据列,第二个参数是数据将被分组的列,在这个例子中,数据是根据字母分组的。第三个参数是一个将应用于每个组的函数,在这个例子中,我们传递了 summary()函数 ,因为我们想按组计算汇总统计数据。
语法: tapply(dfdata, dfgroupBy, summary)
参数
- df$data: 要应用摘要函数的数据
- df$groupBy: 数据应按其分组的列
- summary: 总结函数被应用于每个组
例子: R程序按组获得汇总统计数据
num < - c(20, 30, 40, 50, 50, 70, 80, 25, 35, 45, 55, 65, 75, 85, 95, 105) char < - factor( rep(LETTERS[1:5], c(3, 2, 4, 1, 6)) df < - data.frame(grpBy=char, num=num) tapply( dfnum, dfgrpBy, summary)
输出
$A
Min. 1st Qu. Median Mean 3rd Qu. Max.
20 25 30 30 35 40
$B
Min. 1st Qu. Median Mean 3rd Qu. Max.
50 50 50 50 50 50
$C
Min. 1st Qu. Median Mean 3rd Qu. Max.
25.0 32.5 52.5 52.5 72.5 80.0
$D
Min. 1st Qu. Median Mean 3rd Qu. Max.
45 45 45 45 45 45
$E
Min. 1st Qu. Median Mean 3rd Qu. Max.
55.0 67.5 80.0 80.0 92.5 105.0
方法2:使用data.table方法
在这种方法中,我们首先需要使用library()函数导入 data.table 包。然后我们将data.frame转换为data.table,data.table在R中是data.frame的一个增强版本。由于它的执行速度和较少的代码输入,它在R中变得很流行。然后是最重要的一步,我们按照提供的语法计算每组的汇总统计数据。
语法
setDT(df)
df[, as.list(summary(num)), by = grpBy] 。
参数
- df: 数据框架对象
- num: 数据列
- grpBy: 要进行分组的列
- summary(): 应用于每个组的函数
例子: R程序,通过分组获得汇总统计信息
library(data.table)
num < - c(20, 30, 40, 50, 50, 70, 80, 25,35, 45, 55, 65, 75, 85, 95, 105)char < - factor(rep(LETTERS[1:5], c(3, 2, 4, 1, 6))df < - data.frame(grpBy=char, num=num)setDT(df)df[, as.list(summary(num)), by =grpBy]
输出
grpBy Min. 1st Qu. Median Mean 3rd Qu. Max.
1: A 20 25.0 30.0 30.0 35.0 40
2: B 50 50.0 50.0 50.0 50.0 50
3: C 25 32.5 52.5 52.5 72.5 80
4: D 45 45.0 45.0 45.0 45.0 45
5: E 55 67.5 80.0 80.0 92.5 105
方法3:使用split()函数和purrr包
R语言中的split()函数用于将数据向量划分为由所提供的因子定义的组。我们使用 library() 函数导入 purrr 库。purrr是一个函数式编程工具箱。它带有许多有用的函数,如map。map()函数遍历所有组,并将输出作为一个列表返回。它允许我们取代代码中的for循环,使其更容易阅读。
语法: df %>% split(.$grpBy) %>% map(summary)
参数
df: 数据框架对象
grpBy: 数据框架的列,根据它应该被分组。
例子: R程序通过分组获得汇总统计信息
library(purrr)
num < - c(20, 30, 40, 50, 50, 70, 80, 25,35, 45, 55, 65, 75, 85, 95, 105)char < - factor(rep(LETTERS[1:5], c(3, 2, 4, 1, 6))df < - data.frame(grpBy=char, num=num)df % > % split(. $grpBy) % > % map(summary)
输出
$A
grpBy num
A:3 Min. :20
B:0 1st Qu.:25
C:0 Median :30
D:0 Mean :30
E:0 3rd Qu.:35
Max. :40
$B
grpBy num
A:0 Min. :50
B:2 1st Qu.:50
C:0 Median :50
D:0 Mean :50
E:0 3rd Qu.:50
Max. :50
$C
grpBy num
A:0 Min. :25.0
B:0 1st Qu.:32.5
C:4 Median :52.5
D:0 Mean :52.5
E:0 3rd Qu.:72.5
Max. :80.0
$D
grpBy num
A:0 Min. :45
B:0 1st Qu.:45
C:0 Median :45
D:1 Mean :45
E:0 3rd Qu.:45
Max. :45
$E
grpBy num
A:0 Min. : 55.0
B:0 1st Qu.: 67.5
C:0 Median : 80.0
D:0 Mean : 80.0
E:6 3rd Qu.: 92.5
Max. :105.0
方法4:使用dplyr
使用group_by函数按提供的变量进行分组。然后用summaryize函数对分组后的数据计算最小值、q1、中位数、平均值、q3、最大值。这些统计值与 summary 函数产生的值相同。唯一的区别是,在这里我们必须使用 summaryize 函数在分组数据上明确调用这些函数。这个函数根据指定的函数将分组的列还原为一个单一的值。
语法
df %>%
group_by(grpBy) %>%
summarize(min = min(num), q1 = quantile(num, 0.25), median = median(num), mean = mean(num), q3 = quantile(num, 0.75), max = max(num)
参数
df: 数据框架对象
grpBy: 要进行分组的列
例子: R程序,通过分组获得汇总统计数据
library(dplyr)
num < \- c(20, 30, 40, 50, 50, 70, 80, 25,35, 45, 55, 65, 75, 85, 95, 105)char < \- factor(rep(LETTERS[1:5], c(3, 2, 4, 1, 6)) df < \- data.frame(grpBy=char, num=num)df % >%
group_by(grpBy) % >%
summarize(min=min(num),
q1=quantile(num, 0.25),
median=median(num),
mean=mean(num),
q3=quantile(num, 0.75) ,
max=max(num)
输出
grpBy min q1 median mean q3 max
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 20 25 30 30 35 40
2 B 50 50 50 50 50 50
3 C 25 32.5 52.5 52.5 72.5 80
4 D 45 45 45 45 45 45
5 E 55 67.5 80 80 92.5 105