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

2021-02-19 表哥有話講

作者:黃天元,復旦大學博士在讀,目前研究涉及文本挖掘、社交網絡分析和機器學習等。希望與大家分享學習經驗,推廣並加深R語言在業界的應用。

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


前言

上篇介紹如何從表中檢索一個或多個數據列,本章介紹如何在R中對表格數據進行排序,主要使用arrange函數。

首先我們加載必要的包:

此外,我們會用到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語言入門及數據挖掘
回復 人工智慧     三個月入門人工智慧
回復 數據分析師  數據分析師成長之路 
回復 機器學習     機器學習的商業應用
回復 數據科學     數據科學實戰
回復 常用算法     常用數據挖掘算法

告訴你個悲傷的故事,三天後又是周一↓

相關焦點

  • 左手用R右手Python系列7——排序
    杜雨,EasyCharts團隊成員,R語言中文社區專欄作者,興趣方向為:Excel商務圖表,R語言數據可視化,地理信息數據可視化。個人公眾號:數據小魔方(微信ID:datamofang) ,「數據小魔方」創始人。排序可能是日常數據清洗過程中比較高頻的應用了,今天這一篇給大家介紹R語言和Python中最為常見的排序函數應用。
  • R語言 | 數據操作dplyr包
    [更新~] Python網絡爬蟲與文本數據分析公眾號只帶著Python字眼,卻分享著R語言,不務正業,任性了~dplyr簡介dplyr是R語言的數據分析包,很像python中的pandas,能對dataframe
  • R語言中的排序,集合運算,reshape,以及merge總結
    不想排版,心情也不好,但是這個知識點很重要,尤其是學習R語言的朋友,請仔細看~一直以來我都是隨便看了點R的編程教程,因為我學了一點點
  • R語言入門教程 | tidyverse包之數據處理
    大家在學習R語言的時候,大多參考《R語言實戰》這本書,但這本書年代過於久遠
  • R語言學習指南(3) tidyverse的基礎使用
    tidyverse是為數據科學設計的R軟體包,它包含(ggplot2、dplyr、tidyr、stringr、magrittr、tibble)等一系列熱門軟體包,學好tidyverse的使用可也讓你站上另一個高度,從而高效的處理數據,因此本文檔不僅僅做一些案例介紹,而是希望以較為正確的學習方法來介紹R語言,使大家少走彎路,快速入門掌握R語言
  • 對照著Excel入門R語言表格數據處理
    ,Excel也可以實現多變量排序,如下。#按照單個變量排序,默認升序排列;by_id <- arrange(dt,id)#通過嵌套desc()函數實現降序排列;by_RNA <- arrange(dt,desc(RNA_log2FC))
  • R語言實現幾種經典排序算法
    冒泡排序        冒泡排序是一種計算機科學領域的較簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
  • R語言繪製條形圖
    繪製帶誤差棒的條形圖加載數據包library(ggplot2)新建數據data <- data.frame(  name=letters[1:5],  value=sample(seq(4,15),5),  sd=c(1,0.2,3,2,4))繪製條形圖ggplot(data) +geom_bar(
  • R語言ETL系列:過濾(filter)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com前言本章節介紹如何根據條件對表格進行過濾,主要使用filter函數進行實現。首先加載需要的包和數據,我們會用到R語言自帶的mtcars數據集。首先我們把行的名稱轉化為一列數據,名為rownams。
  • R語言ETL系列:匯總(summarise)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com本章講解如何使用summarise函數完成數據的匯總。在開講之前,我們需要理解,什麼叫做匯總。舉個例子,如果我們現在對學校的學生身高進行了測量,我們需要得到學生的平均身高,那麼我們把所有學生的身高加起來,除以學生的數量,得到身高平均值,這就完成了一個匯總計算。
  • R語言ETL系列:創建欄位(mutate)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com有沒有一些時候你想要給表格加一個新的列?本章將會介紹如何在表格中創建新的欄位。這些知識對於機器學習中的特徵工程尤為重要,是必須掌握的基礎。最後,我們還介紹了如何對字符型的變量進行拼接和拆分,如果需要進行文本挖掘的話,這些技能是必不可少的。
  • 《實習日記》| 7月20日 R語言筆記——dplyr
    7月20日R語言筆記——dplyr7月20日R語言筆記——dplyr五個基礎函數1.mutate(),新增列2.select
  • R語言基於dplyr實現數據快捷操作
    R語言在處理大數據方面一直是被人詬病的地方,那麼有人就為R語言打造了一個dplyr包可以實現高效的數據預處理,減少內存的消耗,提升處理效率
  • Go語言實現常用排序算法
    動態圖如下:實現代碼如下:func QuickSort(arr []int, left, right int) { l := left r := right pivot := arr[(left+right)/2] for l < r { for
  • R語言入門筆記·數據·排序與長寬型轉換
    編者按:   1、 加粗為代碼,藍色字體為解釋   2、無>且有[1]則後面為r輸出的結果
  • R語言常用數據處理代碼整理
    現基於各類R語言入門書整理R中常見的數據處理代碼。目 錄1. 預覽數據集2. 查看數據集結構3.數據集中列排序8. 數據集中行排序8.1 升序排列8.2 降序排列8.3 缺失值排序9.數據集中行排序在數據集中,列變量中常常會有缺失值,離群值等異常值,在進行數據可視化時,有時也需要按數據大小排序進行繪圖。這裡就需要用到行排序,按升序、降序排列可以快速找到一列數值的極值。
  • 快速排序(QSort,快排)算法及C語言實現
    上節介紹了如何使用起泡排序的思想對無序表中的記錄按照一定的規則進行排序,本節再介紹一種排序算法——快速排序算法(Quick Sort)。
  • 寫給零基礎同學的R語言第四篇教程-神奇R包dplyr
    符合tidy data要求的數據框3.排序現在是按照Sampleid列排序的,我們按用geneid排:frame1<-arrange(frame1,geneid) (這裡的arrange空值操作用表-frame3(這裡用到的left_join命令,下面會講到) 二、Dplyr能實現的小動作1.arrange 排序按某一/兩列值的大小,按照升/降對行排序。
  • R語言中plyr包
    其解決之道,在R語言中,有3種方式:  (1) for 顯式循環,但是這種方式的缺點也很明顯,代碼長,易出錯,也難以並行化;  (2) 拜R語言的向量計算特點所賜,在R當中,大多數問題不需要用顯示循環方式,而代之以base包中的apply函數族及其它的一些函數,直接對向量,數組,列表和數據框實現循環的操作。
  • 堆排序算法C語言詳解
    通過將無序錶轉化為堆,可以直接找到表中最大值或者最小值,然後將其提取出來,令剩餘的記錄再重建一個堆,取出次大值或者次小值,如此反覆執行就可以得到一個有序序列,此過程為堆排序。堆排序過程的代碼實現需要解決兩個問題:如何將得到的無序序列轉化為一個堆?在輸出堆頂元素之後(完全二叉樹的樹根結點),如何調整剩餘元素構建一個新的堆?