📜  使用 Dplyr 在 R 中按函数分组(1)

📅  最后修改于: 2023-12-03 14:49:39.022000             🧑  作者: Mango

使用 Dplyr 在 R 中按函数分组

Dplyr 是一个用于数据处理的 R 包,提供了一些非常方便的函数,可以让我们在数据处理任务中更快地进行操作。其中,按函数分组也是一项非常常见的数据处理任务,本文将介绍在 Dplyr 中如何进行按函数分组。

1. 准备数据

首先,我们需要准备一份数据,来进行我们的演示操作。这里我们将使用 R 中的内置数据集 mtcars

library(dplyr)

# 加载数据
data("mtcars")

# 查看数据
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

我们可以看到,这份数据共有 11 列,包含汽车的各种信息,例如:每加仑的英里数(mpg)、汽缸数(cyl)等等。

2. 按函数分组

接下来,我们将按某一函数对 mtcars 数据集进行分组操作。这里以最简单的按 cyl 列进行分组为例:

# 按 cyl 分组
grouped_data <- mtcars %>% 
  group_by(cyl)

# 查看分组后的数据
head(grouped_data, n = 12)
## # A tibble: 12 x 11
## # Groups:   cyl [3]
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  21       6  160   110  3.9  2.62  16.5     0     1     4     4
##  2  21       6  160   110  3.9  2.88  17.0     0     1     4     4
##  3  22.8     4  108    93  3.85 2.32  18.6     1     1     4     1
##  4  21.4     6  258   110  3.08 3.22  19.4     1     0     3     1
##  5  18.7     8  360   175  3.15 3.44  17.0     0     0     3     2
##  6  18.1     6  225   105  2.76 3.46  20.2     1     0     3     1
##  7  14.3     8  360   245  3.21 3.57  15.8     0     0     3     4
##  8  24.4     4  146.7  62  3.69 3.19  20       1     0     4     2
##  9  22.8     4  140.8  95  3.92 3.15  22.9     1     0     4     2
## 10  19.2     6  167.6 123  3.92 3.44  18.3     1     0     4     4
## 11  17.8     6  167.6 123  3.92 3.44  18.9     1     0     4     4
## 12  16.4     8  275   180  3.07 4.07  17.4     0     0     3     3

可以看到,我们使用了 group_by 函数将 mtcarscyl 列进行了分组,这里的 grouped_data 是一个所谓的“分组数据框”,它看起来与普通的数据框有些不同。接下来,我们可以对这个“分组数据框”进行各种操作,例如:筛选(filter)、求和(summarize)等等操作。

3. 分组操作

我们已经将 mtcarscyl 列进行了分组,接下来,我们将进行一些简单的分组操作演示。

3.1 筛选

在筛选数据时,我们需要借助 filter 函数,然而,这个函数在我们已经进行了分组后,表现会有些不同:

# 筛选 cyl 列为 4 的数据
filtered_data <- grouped_data %>% 
  filter(cyl == 4)

# 查看筛选后的数据
head(filtered_data)
## # A tibble: 6 x 11
## # Groups:   cyl [1]
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  22.8     4  108    93  3.85 2.32  18.6     1     1     4     1
## 2  24.4     4  146.7  62  3.69 3.19  20       1     0     4     2
## 3  22.8     4  140.8  95  3.92 3.15  22.9     1     0     4     2
## 4  32.4     4  78.7   66  4.08 2.2   19.5     1     1     4     1
## 5  30.4     4  75.7   52  4.93 1.62  18.5     1     1     4     2
## 6  33.9     4  71.1   65  4.22 1.84  19.9     1     1     4     1

可以看到,我们使用了 filter 函数对 grouped_datacyl 列为 4 的数据进行了筛选操作。和普通的筛选函数相比,这里的 filter 函数只对分组后的数据集的相应分组进行操作。也就是说,上面的 filtered_data 中仅包含 cyl 列为 4 的数据。

3.2 求和

在对分组数据进行求和操作时,我们需要使用 summarize 函数,然而,这个函数在我们已经进行了分组后,表现也会有些不同:

# 对 cyl 列为 4 分组后,计算每组的 mpg 列平均值
summarized_data <- grouped_data %>% 
  filter(cyl == 4) %>%
  summarize(avg_mpg = mean(mpg))

# 查看计算结果
summarized_data
## # A tibble: 1 x 2
##     cyl avg_mpg
##   <dbl>   <dbl>
## 1     4    26.7

可以看到,我们使用了 summarize 函数对 cyl 列为 4 的数据进行了求和操作,这里的 avg_mpg 表示的是 mpg 列的平均值。和普通的求和函数相比,这里的 summarize 函数只对分组后的数据集的相应分组进行操作。也就是说,上面的 summarized_data 中仅包含 cyl 列为 4 的数据的 mpg 均值。

4. 总结

通过本文的介绍,我们学会了如何在 Dplyr 中按函数分组及进行分组操作。在实际的数据分析及处理中,这些操作将受益良多,希望大家掌握后多加练习。