R語言ETL系列:匯總(summarise)

2021-02-26 表哥有話講

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

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

本章講解如何使用summarise函數完成數據的匯總。在開講之前,我們需要理解,什麼叫做匯總。舉個例子,如果我們現在對學校的學生身高進行了測量,我們需要得到學生的平均身高,那麼我們把所有學生的身高加起來,除以學生的數量,得到身高平均值,這就完成了一個匯總計算。匯總計算的方式多種多樣,比如我們要得到最高的身高是多少,最低的身高是多少,身高是中位數是多少,這些都是匯總計算。
在數據表中,數據的匯總的實質就是:我們根據一列數據(本質來說是一個向量),得到一個值,來反映總體在這個屬性上的特徵。本章會用到R語言自帶cars數據集,下面我們先加載需要的包,並把cars轉化為tibble,存放在cars1變量中。它只包含兩列數據,第一列是汽車的即時速度,第二列是這個速度下要停止下來會繼續跑多遠。

1library(tidyverse)
2cars %>% as_tibble() -> cars1
3cars1
4## # A tibble: 50 x 2
5##    speed  dist
6##    <dbl> <dbl>
7##  1     4     2
8##  2     4    10
9##  3     7     4
10##  4     7    22
11##  5     8    16
12##  6     9    10
13##  7    10    18
14##  8    10    26
15##  9    10    34
16## 10    11    17
17## # ... with 40 more rows

均值和中位數代表了數據的一般水平,是重要的衡量指標。下面我們看看如何匯總測試的平均值和中位數。

1#平均速度
2cars1 %>%
3  summarise(mean(speed))
4## # A tibble: 1 x 1
5##   `mean(speed)`
6##           <dbl>
7## 1          15.4
8#速度的中位數
9cars1 %>% 
10  summarise(median(speed))
11## # A tibble: 1 x 1
12##   `median(speed)`
13##             <dbl>
14## 1              15

SQL代碼分別為:

<SQL> SELECT AVG(`speed`) AS `mean(speed)`
FROM `cars1`

<SQL> SELECT MEDIAN(`speed`) AS `median(speed)`
FROM `cars1`

注意,我們這裡沒有給最後的結果命名,因此結果中默認原來的值為命名,也就是說mean(speed)成為了列的名稱,事實上我們可以通過賦值來改變它,例子如下:

1cars1 %>%
2  summarise(speed_avg = mean(speed))
3## # A tibble: 1 x 1
4##   speed_avg
5##       <dbl>
6## 1      15.4

現在得到結果的名稱就變為speed_avg了,相應的SQL代碼如下所示:

<SQL> SELECT AVG(`speed`) AS `speed_avg`
FROM `cars1`

但是基本模式與上面一致,比如我們要知道速度這一列的標準差:

1cars1 %>% 
2  summarise(speed_sd = sd(speed))
3## # A tibble: 1 x 1
4##   speed_sd
5##      <dbl>
6## 1     5.29

與求均值的例子相比較,我們知識改變了最後的列名稱speed_sd,以及求值函數sd。我們會通過變化求值函數來進行不同的匯總,首先給大家介紹不同的匯總求值函數。

中心化匯總:平均值(mean)、中位數(median)

離散化匯總:標準差(sd)、四分位距(IQR)、絕對中位差(mad)

範圍匯總:最大值(max)、最小值(min)、分位數(quantile)

位置匯總:首位(first)、末位(last)、自定義位置(nth)

計數匯總:簡單計數(n)、種類計數(n_distinct)

邏輯匯總:最少滿足(any)、全部滿足(all)

上一節中我們介紹的匯總函數已經能夠滿足較為豐富的匯總功能,本節會為每個匯總給出範例,並對一些無法「見名知意」的函數進行具體的介紹。這裡我們會統一對cars1的speed列進行操作。

1#均值
2cars1 %>% 
3  summarise(speed.avg = mean(speed))
4## # A tibble: 1 x 1
5##   speed.avg
6##       <dbl>
7## 1      15.4
8#中位數
9cars1 %>% 
10  summarise(speed.median = median(speed))
11## # A tibble: 1 x 1
12##   speed.median
13##          <dbl>
14## 1           15

需要注意的是,R語言對缺失值是非常敏感的,也就說如果數據中有缺失值,那麼匯總返回的平均值也會是缺失值。如果需要忽略缺失值,應該在mean函數中設置na.rm = T,也就是用以下語句:cars %>% summarise(speed.avg = mean(speed,na.rm = T)).

SQL代碼:

<SQL> SELECT AVG(`speed`) AS `speed.avg`
FROM `cars1`

<SQL> SELECT MEDIAN(`speed`) AS `speed.median`

1#標準差
2cars1 %>% 
3  summarise(speed.sd = sd(speed))
4## # A tibble: 1 x 1
5##   speed.sd
6##      <dbl>
7## 1     5.29
8#IQR
9cars1 %>% 
10  summarise(speed.IQR = IQR(speed))
11## # A tibble: 1 x 1
12##   speed.IQR
13##       <dbl>
14## 1         7
15#MAD
16cars1 %>% 
17  summarise(speed.MAD = mad(speed))
18## # A tibble: 1 x 1
19##   speed.MAD
20##       <dbl>
21## 1      5.93

IQR,四分位距,具體計算方法為IQR(x)= quantile(x, 3/4) - quantile(x, 1/4),也就是處於四分之三位置的數值減去處於四分之一位置的數值的差值。MAD,絕對中位差,指的是所有數值減去中位數的絕對值,然後相加的結果。

SQL代碼如下:

<SQL> SELECT STDEV(`speed`) AS `speed.sd`
FROM `cars1`

<SQL> SELECT IQR(`speed`) AS `speed.IQR`
FROM `cars1`

<SQL> SELECT MAD(`speed`) AS `speed.MAD`
FROM `cars1`

1#最大值
2cars1 %>% 
3  summarise(speed.max = max(speed))
4## # A tibble: 1 x 1
5##   speed.max
6##       <dbl>
7## 1        25
8#最小值
9cars1 %>% 
10  summarise(speed.min = min(speed))
11## # A tibble: 1 x 1
12##   speed.min
13##       <dbl>
14## 1         4
15#50%分位數
16cars1 %>% 
17  summarise(speed.quantile = quantile(speed,0.5))
18## # A tibble: 1 x 1
19##   speed.quantile
20##            <dbl>
21## 1             15

注意分位數需要設定一個唯一值,對於匯總功能而言,一列只能匯總為一個值而不是多個值。另外,這裡設置為0.5,那麼就會求50%分位數,這個用戶可以自定義選擇。

SQL代碼:

<SQL> SELECT MAX(`speed`) AS `speed.max`
FROM `cars1`

<SQL> SELECT MIN(`speed`) AS `speed.min`
FROM `cars1`

<SQL> SELECT QUANTILE(`speed`, 0.5) AS `speed.quantile`
FROM `cars1`

1#首行
2cars1 %>% 
3  summarise(speed.1st = first(speed))
4## # A tibble: 1 x 1
5##   speed.1st
6##       <dbl>
7## 1         4
8#末行
9cars1 %>% 
10  summarise(speed.last = last(speed))
11## # A tibble: 1 x 1
12##   speed.last
13##        <dbl>
14## 1         25
15#第3行
16cars1 %>% 
17  summarise(speed.nth = nth(speed,3))
18## # A tibble: 1 x 1
19##   speed.nth
20##       <dbl>
21## 1         7

1#首行
2cars1 %>% 
3  summarise(row.number = n())
4## # A tibble: 1 x 1
5##   row.number
6##        <int>
7## 1         50
8#檢測了多少種速度
9cars1 %>% 
10  summarise(speed.n = n_distinct(speed))
11## # A tibble: 1 x 1
12##   speed.n
13##     <int>
14## 1      19

n()其實就是統計了表格的總行數,裡面不需要放任何東西。但是如果想要知道試驗中一共檢測了多少種速度,那麼就需要用到n_distinct函數,它會統計一共有多少個不同的速度。

SQL代碼:

<SQL> SELECT COUNT() AS `row.number`
FROM `cars1`

<SQL> SELECT COUNT(DISTINCT `speed`) AS `speed.n`
FROM `cars1`

這個匯總方法的本質是,看看向量中是不是有任意一個能夠滿足要求,或者是否能夠全部滿足要求。例如,學校學生身高是不是全部的同學都超過了1米?有沒有任何同學的身高達到了兩米?需要注意的是,這個匯總會返回一個邏輯型結果,也就是TRUE或者FALSE。
下面還是用我們的數據集來舉例:

1#speed至少有一個是大於10的嗎?
2cars1 %>%
3  summarise(any(speed > 10))
4## # A tibble: 1 x 1
5##   `any(speed > 10)`
6##   <lgl>            
7## 1 TRUE
8#speed中全部數值都大於10嗎?
9cars1 %>%
10  summarise(all(speed > 10))
11## # A tibble: 1 x 1
12##   `all(speed > 10)`
13##   <lgl>            
14## 1 FALSE

SQL代碼:

<SQL> SELECT ANY(`speed` > 10.0) AS `any(speed > 10)`
FROM `cars1`

<SQL> SELECT ALL(`speed` > 10.0) AS `all(speed > 10)`
FROM `cars1`

本章介紹了匯總的基本概念,並通過變換求值函數,實現各種不同的匯總操作。但凡是能夠對向量進行計算並返回單一值的函數,都能夠作為匯總的求值函數,我們甚至可以自定義求值函數,這為我們的工作提供了極大的便利。


往期精彩:


公眾號後臺回復關鍵字即可學習

回復 爬蟲            爬蟲三大案例實戰
回復 Python       1小時破冰入門
回復 數據挖掘     R語言入門及數據挖掘
回復 人工智慧     三個月入門人工智慧
回復 數據分析師  數據分析師成長之路 
回復 機器學習     機器學習的商業應用
回復 數據科學     數據科學實戰
回復 常用算法     常用數據挖掘算法

相關焦點

  • R語言筆記-dplyr-2-表操作
    前文:R語言筆記-dplyr-1-基礎篇表操作指像sql中的left join,inner join等表格之間的操作%>% rowwise() %>% summarise(m = mean(c(x, y, z)))df %>% rowwise(name) %>% summarise(m = mean(c(x, y, z)))行匯總統計dplyr::
  • 對照著Excel入門R語言表格數據處理
    這部分內容對應Excel「數據」選項卡下的分類匯總功能,如下圖。dplyr主要使用summarise()函數進行統計分析,當然這使用apply()函數也可以做到,但結合上group_by()函數可實現按照分組進行「分類匯總」。#summarise()統計最大值,結果為單列表格。列名這裡是'max(RNA_log2FC)',當然也可以在統計函數前指定生成數據的列名。
  • R語言 | 數據操作dplyr包
    [更新~] Python網絡爬蟲與文本數據分析公眾號只帶著Python字眼,卻分享著R語言,不務正業,任性了~dplyr簡介dplyr是R語言的數據分析包,很像python中的pandas,能對dataframe
  • R語言基於dplyr實現數據快捷操作
    R語言在處理大數據方面一直是被人詬病的地方,那麼有人就為R語言打造了一個dplyr包可以實現高效的數據預處理,減少內存的消耗,提升處理效率
  • dplyr包-匯總數據的方法
    【R語言】已開通R語言社群,五湖四海,天南地北,各行各業,有緣相聚,共享R事,雕刻數據
  • R語言ETL系列:過濾(filter)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com前言本章節介紹如何根據條件對表格進行過濾,主要使用filter函數進行實現。首先加載需要的包和數據,我們會用到R語言自帶的mtcars數據集。首先我們把行的名稱轉化為一列數據,名為rownams。
  • R語言 | Tidyverse包入門介紹
    Analyzing Linguistic DataR Graphics Cookbook··· ···R: The R Project for Statistical Computinghttps://www.r-project.org
  • R語言必知必會之tidyverse(一):管道操作
    徵得張敬信老師同意,本號將轉載張老師關於R語言tidyverse包一系列文章,為大家進行醫學研究提供助力。
  • 八招提升你的 R 語言編程能力
    他們在研究過程中,往往只關注於獨立的模型方法或者漂亮的可視化效果,卻沒人嘗試通過學習計算機科學的相關課程提高自身掌握程式語言的能力,幫助他們敲出更優化和專業的代碼——具有良好的易讀性,可重複使用,運行高效,內存佔用合理,容易移植,最重要的是可以產出可信的結果。作者也不外如是。他在研究期間,曾有過使用 R 語言和Matlab 用於大量機器學習算法的實踐經歷。
  • R語言dplyr包學習筆記(吐血整理宇宙無敵詳細版) - CDA數據分析師
    :summarise1、直接匯總#返回數據框中變量disp的均值summarise(mtcars, mean(disp))#返回數據框中變量disp的標準差summarise(mtcars, sd(disp
  • 「R」dplyr 行式計算
    按行匯總統計dplyr::summarise() 讓一列多行的統計匯總變得非常簡單,當它與 rowwise() 結合時,它也可以簡便地操作匯總一行多列。rowwise() 方法支持任何的匯總函數。rmse#>   <dbl> <dbl>#> 1     4 3.01 #> 2     6 0.985#> 3     8 1.87mods %>% summarise(rsq = summary(mod)$r.squared)#> `summarise()` regrouping output
  • R語言ETL系列:創建欄位(mutate)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com有沒有一些時候你想要給表格加一個新的列?本章將會介紹如何在表格中創建新的欄位。>往期精彩:公眾號後臺回復關鍵字即可學習回復 爬蟲            爬蟲三大案例實戰回復 Python       1小時破冰入門回復 數據挖掘     R語言入門及數據挖掘
  • R語言ETL工程系列:排序(arrange)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com前言上篇介紹如何從表中檢索一個或多個數據列,本章介紹如何在R中對表格數據進行排序,主要使用arrange函數。
  • R語言數據處理方法~小結
    3.1.6 匯總summarise3.2 分組group_by當對數據集通過 group_by() 添加了分組信息後,mutate(), arrange() 和 summarise() 函數會自動對這些 tbl 類數據執行分組操作
  • R語言常用代碼集
    推薦幾本看過的R語言書:下面都是以前寫的一些代碼,配合以前文章使用效果更佳:使用AI和R語言的綜合製圖方法
  • 《實習日記》| 7月20日 R語言筆記——dplyr
    7月20日R語言筆記——dplyr7月20日R語言筆記——dplyr五個基礎函數1.mutate(),新增列2.select
  • R語言中plyr包
    文章轉載自哈爾濱商業大學銀河統計工作室前言  apply族函數是R語言中很有特色的一類函數,包括了apply、sapply、lapply、tapply
  • 商務智能軟體FineBI的ETL處理
    業務包,進入BIdemo業務包配置界面,如下圖:在頁面下方點擊+ETL表按鈕即可進入ETL處理界面,如下圖:點擊右上角的添加表按鈕即可添加非業務包內的數據表作為轉化表的基本表,如下隨便選擇一張數據表,比如說a_基本信息數據表,選中它,點擊下一步,頁面跳轉到數據表設置界面,此時顯示的是選中的a_基本信息表的設置界面,頁面左半邊為表數據設置區域,右半邊是當前表進行etl
  • R語言學習指南(3) tidyverse的基礎使用
    tidyverse是為數據科學設計的R軟體包,它包含(ggplot2、dplyr、tidyr、stringr、magrittr、tibble)等一系列熱門軟體包,學好tidyverse的使用可也讓你站上另一個高度,從而高效的處理數據,因此本文檔不僅僅做一些案例介紹,而是希望以較為正確的學習方法來介紹R語言,使大家少走彎路,快速入門掌握R語言
  • R語言數據處理全流程教學
    R 語言作為一款功能強大的統計分析、繪圖和數據挖掘軟體,被社會科學領域的研究者們廣泛應用於數據處理和圖表製作等工作。由於 R 語言需要一定的編程基礎,其開源屬性又帶來了千千萬萬的功能包(package),使得 R 語言的初學者常常不知從何入手,不知道學習哪些代碼與功能包足夠滿足自己的統計需求。