R语言ETL工程系列:排序(arrange)

浏览: 1747

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com


前言

上篇介绍如何从表中检索一个或多个数据列,本章介绍如何在R中对表格数据进行排序,主要使用arrange函数。

首先我们加载必要的包:

1library(tidyverse)

此外,我们会用到R语言自带的数据集mtcars。它本身是数据框格式的,我们会把它转化为tibble格式,并存放在mtcars1变量中。让我们审视一下本章要用到的数据集:

1mtcars %>% as_tibble() -mtcars1
2mtcars1
3## # A tibble: 32 x 11
4##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
5##  * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
6##  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
7##  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
8##  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
9##  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
10##  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
11##  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
12##  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
13##  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
14##  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
15## 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
16## # ... with 22 more rows

基于单列排序

通过审视数据,我们发现数据的排布是乱序的,没有按照一定的顺序展示出来。如果我们想要数据表根据mpg变量排序,那么就需要用arrange函数。

1mtcars1 %>% 
2  arrange(mpg)
3## # A tibble: 32 x 11
4##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
5##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
6##  1  10.4     8  472    205  2.93  5.25  18.0     0     0     3     4
7##  2  10.4     8  460    215  3     5.42  17.8     0     0     3     4
8##  3  13.3     8  350    245  3.73  3.84  15.4     0     0     3     4
9##  4  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
10##  5  14.7     8  440    230  3.23  5.34  17.4     0     0     3     4
11##  6  15       8  301    335  3.54  3.57  14.6     0     1     5     8
12##  7  15.2     8  276.   180  3.07  3.78  18       0     0     3     3
13##  8  15.2     8  304    150  3.15  3.44  17.3     0     0     3     2
14##  9  15.5     8  318    150  2.76  3.52  16.9     0     0     3     2
15## 10  15.8     8  351    264  4.22  3.17  14.5     0     1     5     4
16## # ... with 22 more rows

这样一来,我们发现数据mpg列已经从小到大进行了排列,而其他列也根据排列进行了调整。

相应的SQL代码如下:

1<SQL> SELECT *
2FROM `mtcars`
3ORDER BY `mpg`

基于多列排序

有时候,我们需要根据多列进行排序。例如,我们数据如果有年月日的数据,我们需要表格先按照年排序,然后在年内再按照月份排序,月份中再根据日进行排序。

arrange函数中通过可以放入多列的名称来对多列进行排序,列名称之间需要以逗号相隔。比如,我们想要先对cyl进行排序,再对disp进行排序:

1mtcars1 %>%
2  arrange(cyl,disp) %>%
3  print(n = Inf)
4## # A tibble: 32 x 11
5##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
6##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
7##  1  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
8##  2  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
9##  3  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
10##  4  27.3     4  79      66  4.08  1.94  18.9     1     1     4     1
11##  5  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
12##  6  22.8     4 108      93  3.85  2.32  18.6     1     1     4     1
13##  7  21.5     4 120.     97  3.7   2.46  20.0     1     0     3     1
14##  8  26       4 120.     91  4.43  2.14  16.7     0     1     5     2
15##  9  21.4     4 121     109  4.11  2.78  18.6     1     1     4     2
16## 10  22.8     4 141.     95  3.92  3.15  22.9     1     0     4     2
17## 11  24.4     4 147.     62  3.69  3.19  20       1     0     4     2
18## 12  19.7     6 145     175  3.62  2.77  15.5     0     1     5     6
19## 13  21       6 160     110  3.9   2.62  16.5     0     1     4     4
20## 14  21       6 160     110  3.9   2.88  17.0     0     1     4     4
21## 15  19.2     6 168.    123  3.92  3.44  18.3     1     0     4     4
22## 16  17.8     6 168.    123  3.92  3.44  18.9     1     0     4     4
23## 17  18.1     6 225     105  2.76  3.46  20.2     1     0     3     1
24## 18  21.4     6 258     110  3.08  3.22  19.4     1     0     3     1
25## 19  16.4     8 276.    180  3.07  4.07  17.4     0     0     3     3
26## 20  17.3     8 276.    180  3.07  3.73  17.6     0     0     3     3
27## 21  15.2     8 276.    180  3.07  3.78  18       0     0     3     3
28## 22  15       8 301     335  3.54  3.57  14.6     0     1     5     8
29## 23  15.2     8 304     150  3.15  3.44  17.3     0     0     3     2
30## 24  15.5     8 318     150  2.76  3.52  16.9     0     0     3     2
31## 25  13.3     8 350     245  3.73  3.84  15.4     0     0     3     4
32## 26  15.8     8 351     264  4.22  3.17  14.5     0     1     5     4
33## 27  18.7     8 360     175  3.15  3.44  17.0     0     0     3     2
34## 28  14.3     8 360     245  3.21  3.57  15.8     0     0     3     4
35## 29  19.2     8 400     175  3.08  3.84  17.0     0     0     3     2
36## 30  14.7     8 440     230  3.23  5.34  17.4     0     0     3     4
37## 31  10.4     8 460     215  3     5.42  17.8     0     0     3     4
38## 32  10.4     8 472     205  2.93  5.25  18.0     0     0     3     4

一般来说,tibble格式只会显示数据的前十行,如果我们想要看到全部数据,可以在最后运行print(n = Inf),这表示我们要看表格的所有行。但是对于行数过多的数据集不建议使用这个函数,本例因为需要看到排序效果,因此使用了这个操作。

相应的SQL代码如下:

1<SQL> SELECT *
2FROM `mtcars`
3ORDER BY `cyl`, `disp`

降序排列

细心的你也许会观察到,我们的排序都是从小到大排列的,也称为升序排列。但是在实际应用中,很多时候会用到降序排列,这时候只需要对需要降序排列的列进行降序处理即可,具体函数为desc()。例子如下:

1mtcars1 %>%
2  arrange(desc(disp))
3## # A tibble: 32 x 11
4##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
5##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
6##  1  10.4     8   472   205  2.93  5.25  18.0     0     0     3     4
7##  2  10.4     8   460   215  3     5.42  17.8     0     0     3     4
8##  3  14.7     8   440   230  3.23  5.34  17.4     0     0     3     4
9##  4  19.2     8   400   175  3.08  3.84  17.0     0     0     3     2
10##  5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
11##  6  14.3     8   360   245  3.21  3.57  15.8     0     0     3     4
12##  7  15.8     8   351   264  4.22  3.17  14.5     0     1     5     4
13##  8  13.3     8   350   245  3.73  3.84  15.4     0     0     3     4
14##  9  15.5     8   318   150  2.76  3.52  16.9     0     0     3     2
15## 10  15.2     8   304   150  3.15  3.44  17.3     0     0     3     2
16## # ... with 22 more rows

我们可以看到,disp已经是从大到小进行排列了。

相应的SQL代码如下:

1<SQL> SELECT *
2FROM `mtcars`
3ORDER BY `disp` DESC

复合操作

那么如果我们想要先以cyl进行升序排列,在这个基础上对disp进行降序排列应该怎么做呢?相信聪明的读者已经可以自己动手进行操作,代码如下:

1mtcars1 %>%
2  arrange(cyl,desc(disp)) %>%
3  print(n = Inf)
4## # A tibble: 32 x 11
5##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
6##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
7##  1  24.4     4 147.     62  3.69  3.19  20       1     0     4     2
8##  2  22.8     4 141.     95  3.92  3.15  22.9     1     0     4     2
9##  3  21.4     4 121     109  4.11  2.78  18.6     1     1     4     2
10##  4  26       4 120.     91  4.43  2.14  16.7     0     1     5     2
11##  5  21.5     4 120.     97  3.7   2.46  20.0     1     0     3     1
12##  6  22.8     4 108      93  3.85  2.32  18.6     1     1     4     1
13##  7  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
14##  8  27.3     4  79      66  4.08  1.94  18.9     1     1     4     1
15##  9  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
16## 10  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
17## 11  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
18## 12  21.4     6 258     110  3.08  3.22  19.4     1     0     3     1
19## 13  18.1     6 225     105  2.76  3.46  20.2     1     0     3     1
20## 14  19.2     6 168.    123  3.92  3.44  18.3     1     0     4     4
21## 15  17.8     6 168.    123  3.92  3.44  18.9     1     0     4     4
22## 16  21       6 160     110  3.9   2.62  16.5     0     1     4     4
23## 17  21       6 160     110  3.9   2.88  17.0     0     1     4     4
24## 18  19.7     6 145     175  3.62  2.77  15.5     0     1     5     6
25## 19  10.4     8 472     205  2.93  5.25  18.0     0     0     3     4
26## 20  10.4     8 460     215  3     5.42  17.8     0     0     3     4
27## 21  14.7     8 440     230  3.23  5.34  17.4     0     0     3     4
28## 22  19.2     8 400     175  3.08  3.84  17.0     0     0     3     2
29## 23  18.7     8 360     175  3.15  3.44  17.0     0     0     3     2
30## 24  14.3     8 360     245  3.21  3.57  15.8     0     0     3     4
31## 25  15.8     8 351     264  4.22  3.17  14.5     0     1     5     4
32## 26  13.3     8 350     245  3.73  3.84  15.4     0     0     3     4
33## 27  15.5     8 318     150  2.76  3.52  16.9     0     0     3     2
34## 28  15.2     8 304     150  3.15  3.44  17.3     0     0     3     2
35## 29  15       8 301     335  3.54  3.57  14.6     0     1     5     8
36## 30  16.4     8 276.    180  3.07  4.07  17.4     0     0     3     3
37## 31  17.3     8 276.    180  3.07  3.73  17.6     0     0     3     3
38## 32  15.2     8 276.    180  3.07  3.78  18       0     0     3     3

相应的SQL代码如下:

1<SQL> SELECT *
2FROM `mtcars`
3ORDER BY `cyl`, `disp` DESC

本章介绍了如何在R中完成排序操作,包括基于单列与多列的排序,以及升序与降序操作。在实际操作中,通过组合这些方法,我们能够对一个大的数据表格进行有层次的排序,是需要牢记的实用基本操作。

往期精彩:


公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册