R語言必知必會之tidyverse(一):管道操作

2021-03-02 臨床研究與醫學統計

徵得張敬信老師同意,本號將轉載張老師關於R語言tidyverse包一系列文章,為大家進行醫學研究提供助力。

來源:R&Python數據科學 知乎專欄

作者簡介:張敬信,高校數學教師,研究興趣:數學,數學建模,數據挖掘,機器學習,Matlab, R語言,Python,Mathematica,Latex

連結:https://www.zhihu.com/people/huc_zhangjingxin

前言

Hadley 大神的 tidyverse 包,將數據處理和建模整個流程所涉及到的:讀入、清洗、重塑、匯總、可視化、探索、建模、結果展示的整個流程,都以一種「優雅」的方式整合到了一起。

我之前學了一遍 Hadley 的配套書《R for Data Science》,雖然比較系統全面,但重點部分有點過於基礎,實用性欠缺了點。最近偶然看到一個非常好且精煉的進階資料《Working in the Tidyverse》,主要以它為主,翻譯並學習記錄下來。

強烈建議大家,拋棄流傳甚廣的陳舊的數據操作方面的 R 語法,全面改用 tidyverse。

——————————————————————————————

下面先從第零篇,管道操作,開始。

一. 簡介

magrittr 包引入了管道操作,能夠通過管道將數據從一個函數傳給另一個函數,從而用若干函數構成的管線依次變換你的數據。

先看一個例子,對數據集 warpbreaks,按分類變量 wool 和 tension 分組,對連續變量 breaks 做分組匯總,分別計算均值、中位數、標準差:

warpbreaks %>%
group_by(wool, tension) %>%
summarise_at(vars(breaks), list(~mean(.), ~median(.), ~sd(.)))

管道運算符%>%的意思是:將左邊的運算結果,以輸入的方式傳給右邊函數。若干個函數通過管道連結起來,叫做管線(pipeline)。

"ATMOSPHERE" %>% str_replace("SPHERE", "SQUARE") %>% str_to_lower() %>% print()

管線,也支持 Base R 函數:

month.abb %>% # 內置月份名縮寫的字符串
sample(6) %>%
tolower() %>%
paste0(collapse = "|")

使用管道的好處是:

(1)避免使用過多的中間變量;

(2)程序可讀性大大增強:

管道操作的過程,讀起來就是對原數據集依次進行一系列操作的過程。而非管道操作,讀起來與操作的過程是相反的,比如同樣實現上例:

paste0(tolower(sample(month.abb, 6)), collapse="|")

二. 使用管道操作

管道默認將輸出傳給下一個函數的第1個參數

. <- c(1, 3, 4, 5, NA)
mean(., na.rm=TRUE)

c(1, 3, 4, 5, NA) %>% mean(., na.rm=TRUE)
c(1, 3, 4, 5, NA) %>% mean(na.rm = TRUE) # "."可以省略

2. 輸出可以在右邊使用多次

在右邊的函數調用中需要藉助".":

c(1, 3, 4, 5) %>% plot(., main=paste(., collapse=", "))
# 第1個"."可以省略, 其餘的"."不能省略
c(1, 3, 4, 5) %>% plot(main=paste(., collapse=", "))

3. 輸出傳給不是第1個參數

若函數的第1個參數不是接受數據,需要手動放置"."

# 錯誤做法
# iris %>% plot(Sepal.Width~Petal.Width) # 相當於
# plot(x=iris, y=Sepal.Width~Petal.Width)
# 正確做法
iris %>% plot(Sepal.Width~Petal.Width, data = .)

4. 管道中使用函數

(1) 有時候想在管道中使用匿名函數

month.abb %>% # 選擇子集
{.[1:3]}

# 等同於
month.abb %>%
(function(.) {.[1:3]})

(2) 也可以將整個管線定義為一個函數,需要將"."作為管線的第1個值,將整個管線賦值給一個名字(函數名)

random_sepal_data <- # 函數名
. %>% # 用"."作為管線的開始
select(Species, starts_with("Sepal")) %>%
sample_n(5) %>%
arrange(desc(Sepal.Length))

iris %>%
random_sepal_data()

注意:管線函數總是一元的,只能接受一個參數,而且在管線中參數為一個".";若要在管線內傳遞多個參數,需要用通常的方式 function() 定義函數。

5. 通常操作的管道函數

你可能想要用[ 或 [[ 或 $訪問"."的內容,例如選擇數據框的子集,查看直方圖中某個條形的值。可以用這些函數的前綴形式實現,但可讀性不好:

iris %>%
filter(Petal.Length>2, Petal.Width>2) %>%
`[[`("Sepal.Length") %>%
hist(main="Histogram of 'Sepal.Length' after subsetting")

magrittr 包提供了一些函數來實現這樣的操作,更多函數可用 ?extract 查閱。

iris %>%
head() %>%
extract(c("Sepal.Length","Sepal.Width")) # 提取列, 返回數據框

iris %>%
head() %>%
extract2("Sepal.Length") # 提取1列, 返回向量

注意:不同包中同名的函數,默認是選最近加載的包中的。建議用加前綴的方式「magrittr::」為這樣的函數指定包。

參考文獻:

1. Desi Quintans, Jeff Powell. Working in the Tidyverse. hiercourse.com/

2. Garrett Grolemund, Hadley Wickham. R for Data Science. r4ds.had.co.nz/



相關焦點

  • R語言 | Tidyverse包入門介紹
    今天,我們講一個「讓R能夠和Python在數據處理方面一較高下」的擴展包:tidyverse包。你可以直接調用tidyverse,也可以調用它所轄屬的包。下面,我們講解一些tidyverse中可能使用到的函數,幫助你快速上手這個方便的東西。同時,我們會比較tidyverse和base R之間的不同之處,幫助你更快理解,為什麼tidyverse受到更多的推崇。
  • R語言學習指南(3) tidyverse的基礎使用
    tidyverse是為數據科學設計的R軟體包,它包含(ggplot2、dplyr、tidyr、stringr、magrittr、tibble)等一系列熱門軟體包,學好tidyverse的使用可也讓你站上另一個高度,從而高效的處理數據,因此本文檔不僅僅做一些案例介紹,而是希望以較為正確的學習方法來介紹R語言,使大家少走彎路,快速入門掌握R語言
  • R語言入門教程 | tidyverse包之數據處理
    (中文第二版是2016年),主要著力點也是在R base上,R語言可視化的ggplot2包也只是簡要介紹,而對於tidyverse包,《R語言實戰》並未涉及,這也導致R語言的學習難度增加,今天我們給大家引入tidyverse包的學習。
  • 【tidyverse】R中的tidyverse入門
    這些包作為大數據分析管道的一部分可以很好地協同工作。要了解這些工具及其協同工作的更多信息,請閱讀R for data science。 對於R的新手,請查看我之前的Storybench教程:RStudio筆記本中的R入門。以下教程將介紹tidyverse中用於構建和分析數據集的一些基本功能。
  • R入門?從Tidyverse學起!
    那麼,tidyverse就提供了一個很好的學習思路(tidyverse first),讓我們先忽略編程這道大關,其理念是一開始不談向量、矩陣、數據框、因子、流程控制等概念,直接從數據的操縱入手,讓初學者在最短時間內學會數據的處理與可視化應用。
  • 從另一個視角看 R 語言的方言 Tidyverse
    文中的「我」為作者視角,但譯文中存在的任何不妥之處當然很可能是由譯者引入的,還望讀者不吝賜教[2]。注意:此為簡版在我看來,Tidyverse 的主要問題在於其不利於教學。我相信使用 Tidyverse 而非 base-R 實際上會阻礙對沒有編寫代碼背景的初學者進行教學。這個簡潔的版本僅保留了 TidyverseSkeptic 文中關於教學的部分。
  • 【數據管理】Tidyverse:R 語言學習之旅的新起點
    2 您用tidyverse包嗎?學習R語言的傳統路徑(base R first)多是從變量類型、數據結構、流程控制、循環與自定義函數,也就是以R程式設計作為起點,接著依照數據處理、視覺化、統計與機器學習等應用偏好延續下一個學習的旅程;由tidyverse
  • Tidy時代R語言學習的一些ABC
    新年的第一個計劃,寫一個關於R語言數據處理和操作的教程,突出tidyverse出現之後的新方法。下面這篇小文章,給出了一個tidy時代R語言的入門書單和一些網絡資源。不全面,更不權威,就作為這個新教程系列的參考資料吧。
  • R語言 | 數據操作dplyr包
    類型的數據做很方便的數據處理和分析操作。最初我也很奇怪dplyr這個奇怪的名字,我查到其中一種解釋library(tidyverse)## ── Attaching packages ────────────────────────────────────── tidyverse 1.3.0 ──
  • [R數據科學]tidyverse數據清洗案例詳解
    library(tidyverse) #加載包who #數據展示複雜的管道函數事實上你可以直接只用管道函數構建一個複雜的函數,這樣做去除了中間變量,而且可讀性很強,強烈推薦。library(tidyverse)stocks <- tibble( year = c(2015, 2015, 2016, 2016), half
  • tidyverse —— readr包
    主要參考R for Data Science一書,http://r4ds.had.co.nz/data-import.html#getting-started。parse_logical(), parse_integer(), parse_double(), 和parse_character()這幾個函數,分別將向量解析到對應的邏輯值、整型、雙精度浮點型和字符型。
  • 數據清理工具簡介(Tidyverse)
    很多時候數據處理不僅僅是效率的問題,有時候甚至沒辦法進行數據分析的操作。為了加快數據清理的效率,同時為以後的建模和數據可視化做準備,R語言的Tidyverse包可以提供非常優秀的數據清理、整合和可視化的「一站式服務」。
  • tidyverse —— readxl包
    readxl包,讀取Excel文件專用包,有和tidyverse核心包一樣的特點,快!效率特高!話說Hadley大叔出品就沒有效率低的,可能鍵盤是借來的,著急還。獨立性高,不外部依賴Java啥的,xls和xlsx文件讀取都可以。
  • tidyverse —— forcats包
    作者簡介野菜糰子,R語言中文社區專欄作者
  • 地理數據科學培訓班第一課之初識R語言
    下面我們繼續安裝一些 R 包,部分包如果安裝失敗可以直接跳過,以後需要的時候再安裝:# 安裝 devtoolsinstall.packages("devtools")# tidyverse 系列的 R 包install.packages("tidyverse", dependencies = TRUE
  • R語言空間數據分析學習筆記2——數據基本操作
    本節將會學習如何利用地理空間數據進行連接、篩選等操作,首先我們加載軟體環境和數據。
  • Datacamp學習筆記(1)——R語言中的Tidyverse
    ,在這個功能中我們第一個用到的package就是dplyr,使用這個包,我們能夠對我們的數據進行一系列處理,例如filter(篩選),summarize(進行計算,例如平均值,中位數等)。如果我們想要對這些數據進行操作,那我們要用到dplyr中的verbs,第一個就是filter,它可以幫助我們篩選數據,例如我們篩選所有2007年的數據。在這裡shouxian 需要注意的是,我們用到了%>%這個符號,它在R中的意思是管道,類似於流水線上的工人,在確認了上一步的操作後,做一個標記,然後進入下一步,因此每一步都要表上pipe。
  • R語言學習資源匯總(分學科)
    (滑鼠點點點)的同時結合了一些計算機程式語言的特點,更像是一門專為統計學家量身定製的程式語言,且由於歷史悠久、開源等特點,不少學術界人士會選擇自行開發一個R包作為其學術產出。作為一個學術小白,學習R不僅僅可以優化自身數據處理功力,大批量、可重複地完成許多EXCEL無法實現的功能,也可以打開新的學術領域,運用前人編寫的包輕鬆重複數據計算操作,甚至是編寫自己的包來方便流程化操作,甚至進行發表和吸引獵頭。
  • R數據科學--初見
    終於你跨越茫茫宇宙,來到生信星球,發現了初學者的新大陸前些天豆豆花花各入手一本學R必備的神書《R數據科學》,花花完結了零基礎入門R語言系列和ggplot系列。現在開始跟著這本書的思路走,仔細端詳R語言。如果你還不了解這本書,👇看這裡。
  • R語言中的管道操作
    這是R數據科學的讀書筆記之一,《R數據科學》是一本教你如何用R語言進行數據分析的書。