[R數據科學]tidyverse數據清洗案例詳解

2021-03-02 莊閃閃的R語言手冊
介紹

本中你將學習在R中數據處理簡潔的方法,稱為tidy data。將數據轉換為這種格式需要一些前期工作,但這些工作從長遠來看是值得的。一旦你有了整潔的數據和一些包提供的整潔工具,您將花費很少時間將數據從一種表示轉換到另一種,從而可以將更多的時間花在分析問題上。

本文將為您提供整理數據的實用介紹以及tidyr包中附帶的工具。如果你想了解更多的基本理論,你可能會喜歡發表在《統計軟體雜誌》上的tidy data論文[1]。

本文框架數據清洗案例

我們主要通過一個案例,來了解如何整潔數據,並將案例中的各個有用函數進行詳細解讀。該例子來自《R for data science》[2],案例數據來自tidyr::who,其包含按年份,國家,年齡,性別和診斷方法細分的結核病(TB)病例。數據來自2014年世界衛生組織《全球結核病報告》[3]。

library(tidyverse) #加載包
who #數據展示

這是一個非常典型的現實示例數據集。它包含冗餘列,奇數變量代碼和許多缺失值。我們需要採取多個步驟來對其進行整理。

不是變量的列匯集在一起

首先將不是變量的列聚集在一起。所包含的列包括:

country,iso2和iso3是三個指定國家/地區的變量。

變量名中給出的結構(例如new_sp_m014,new_ep_m014,new_ep_f014)可能是值,而不是變量。

因此,我們需要將從new_sp_m014到newrel_f65的所有列匯總在一起。我們用通用名稱"key"來表示他們。我們知道單元格代表案件數,因此我們將變量數存儲在cases中,並用na.rm去除含有缺失值的行。這裡使用pivot_longer()將數據變長,具體見後面函數詳情。

who1 <- who %>%
pivot_longer(
cols = new_sp_m014:newrel_f65,
names_to = 'key',
values_to = 'cases',
values_drop_na = T
)

who1

對key進行計數,我們可以得到一些有關值結構的提示:

who1 %>% count(key)

其中key的具體含義,查閱可得:

sn 代表無法通過肺部塗片診斷(塗片陰性)的肺結核病例

sp 代表可被診斷為肺部塗片(塗片陽性)的肺結核病例

第六字母:結核病患者的性別。男性(m)和女性(f)

其餘數字給出了年齡段。數據集將案例分為七個年齡組:

替換數據

我們需要對列名稱的格式進行較小的修正:將new_rel替換為newrel(很難在這裡找到它,但是如果您不修正它,我們將在後續步驟中出錯)。這裡使用了stringr包中的str_replace(),將newrel替換new_rel。

who2 <- who1 %>%
mutate( names_from = stringr::str_replace(key,'newrel','new_rel')
)
who2

字符分割

接下來就是將key中的字符進行分割,我們使用separate()對字符進行兩次分割。

1.將在每個下劃線處拆分代碼。

who3 <- who2 %>%
separate(key,c('new','type','sexage'),sep = '_')
who3

利用select()刪除沒用的列:new,iso2,iso3。

who3 %>% count(new)
who4 <- who3 %>% select(-new,-iso2,-iso3)
who4

將分離sexage到sex和age通過的第一個字符後拆分:
who5 <- who4 %>%
separate(sexage,c('sex','age'),sep=1)
who5

這時,who數據集整潔!

可視化

數據清洗完畢,就可以做一些初步的可視化,探索性分析.這裡簡單繪製了前幾個國家不同年份,不同性別的結核病病例總數。

who5 %>% group_by(country,year,sex)  %>% filter(year<2003) %>%
count() %>%
head(100) %>%
ggplot(aes(x=as.factor(year),y=n,fill=country))+geom_col() +facet_wrap(~sex,nrow = 1)+
scale_fill_brewer(palette = "Paired")

複雜的管道函數

事實上你可以直接只用管道函數構建一個複雜的函數,這樣做去除了中間變量,而且可讀性很強,強烈推薦。

who %>%
pivot_longer(
cols = new_sp_m014:newrel_f65,
names_to = "key",
values_to = "cases",
values_drop_na = TRUE
) %>%
mutate(
key = stringr::str_replace(key, "newrel", "new_rel")
) %>%
separate(key, c("new", "var", "sexage")) %>%
select(-new, -iso2, -iso3) %>%
separate(sexage, c("sex", "age"), sep = 1)

所用函數詳細解釋pivot_longer()、poivot_wider()

pivot_longer() 將在列中列名(數值)轉換到一列上。具體可見下圖,將列變量轉化為數據存在year列名中,相當於把數據變長(longer).

函數主要參數:

names_to 字符串,指定要從數據的列名中存儲的數據創建的列的名稱。values_to 字符串,指定要從存儲在單元格值中的數據創建的列的名稱。values_drop_na 如果為真,將刪除value_to列中只包含NAs的行。

例子如上面例子:將new_sp_m014到newrel_f65之間的列選取,匯總到key列名中,值存在cases列名中,並將含有缺失值的行進行刪除。

who1 <- who %>%
pivot_longer(
cols = new_sp_m014:newrel_f65,
names_to = 'key',
values_to = 'cases',
values_drop_na = T
)

當然還有一個和它相反功能的函數poivot_wider()。具體見下圖,相當於把key中的值變為列名,對應的values數據轉化到population中.下面是簡單的例子。

library(tidyverse)
stocks <- tibble(
year = c(2015, 2015, 2016, 2016),
half = c( 1, 2, 1, 2),
return = c(1.88, 0.59, 0.92, 0.17)
)
stocks

我們將數據變寬,將year變為列名,對應在return中的數據進行填充。

stocks %>%
pivot_wider(names_from = year,values_from = return)

separate()

該函數可將字符進行分割,具體案例如上.

默認情況下,當separate()看到非字母數字字符(即不是數字或字母的字符)時,它將分割值。可以用裡面的參數sep。比如:sep='_'。他還有一個功能,當sep=2時,可通過第二個位置進行分割,使用在省份市級,等數據上。例如以下函數,其中into = c("century", "year")將原始分割後的數據導入兩個新列上,分別叫century和year。

table3 %>% 
  separate(year, into = c("century", "year"), sep = 2)

注意:默認情況下,會轉化成字符形式,你可以用參數convert=T,將數據轉化最佳結構。

unite

是separate()的反函數,這裡做個補充。

默認情況下,sep='_'如果我們不需要任何分隔符可以使用sep=''。

參考資料[1]

tidy data論文: http://www.jstatsoft.org/v59/i10/paper

[2]

《R for data science》: https://r4ds.had.co.nz/tidy-data.html

[3]

《全球結核病報告》: http://www.who.int/tb/country/data/download/en/

相關焦點

  • 【數據管理】Tidyverse:R 語言學習之旅的新起點
    2 您用tidyverse包嗎?學習R語言的傳統路徑(base R first)多是從變量類型、數據結構、流程控制、循環與自定義函數,也就是以R程式設計作為起點,接著依照數據處理、視覺化、統計與機器學習等應用偏好延續下一個學習的旅程;由tidyverse
  • 【tidyverse】R中的tidyverse入門
    tidyverse是由RStudio首席科學家Hadley Wickham開發的R套裝的集合。這些包作為大數據分析管道的一部分可以很好地協同工作。要了解這些工具及其協同工作的更多信息,請閱讀R for data science。 對於R的新手,請查看我之前的Storybench教程:RStudio筆記本中的R入門。以下教程將介紹tidyverse中用於構建和分析數據集的一些基本功能。
  • R語言入門教程 | tidyverse包之數據處理
    包,《R語言實戰》並未涉及,這也導致R語言的學習難度增加,今天我們給大家引入tidyverse包的學習。tidyverse 包是 Hadley Wickham 及團隊的集大成之作,是專為數據科學而開發的一系列包的合集, 基於整潔數據,提供了一致的底層設計、語法、數據結構,包括數據導入,數據規整,數據處理,可視化,建模以及形成可重複性報告數據分析的全流程。
  • R語言學習指南(3) tidyverse的基礎使用
    tidyverse是為數據科學設計的R軟體包,它包含(ggplot2、dplyr、tidyr、stringr、magrittr、tibble)等一系列熱門軟體包,學好tidyverse的使用可也讓你站上另一個高度,從而高效的處理數據,因此本文檔不僅僅做一些案例介紹,而是希望以較為正確的學習方法來介紹R語言,使大家少走彎路,快速入門掌握R語言
  • 數據清理工具簡介(Tidyverse)
    很多時候數據處理不僅僅是效率的問題,有時候甚至沒辦法進行數據分析的操作。為了加快數據清理的效率,同時為以後的建模和數據可視化做準備,R語言的Tidyverse包可以提供非常優秀的數據清理、整合和可視化的「一站式服務」。
  • R入門?從Tidyverse學起!
    那麼,tidyverse就提供了一個很好的學習思路(tidyverse first),讓我們先忽略編程這道大關,其理念是一開始不談向量、矩陣、數據框、因子、流程控制等概念,直接從數據的操縱入手,讓初學者在最短時間內學會數據的處理與可視化應用。
  • R語言 | Tidyverse包入門介紹
    事到如今,依舊有「數據處理,Python和R到底學哪個」的爭辯。今天,我們講一個「讓R能夠和Python在數據處理方面一較高下」的擴展包:tidyverse包。你可以直接調用tidyverse,也可以調用它所轄屬的包。下面,我們講解一些tidyverse中可能使用到的函數,幫助你快速上手這個方便的東西。同時,我們會比較tidyverse和base R之間的不同之處,幫助你更快理解,為什麼tidyverse受到更多的推崇。
  • R數據科學--初見
    終於你跨越茫茫宇宙,來到生信星球,發現了初學者的新大陸前些天豆豆花花各入手一本學R必備的神書《R數據科學》,花花完結了零基礎入門R語言系列和ggplot系列。現在開始跟著這本書的思路走,仔細端詳R語言。如果你還不了解這本書,👇看這裡。
  • Tidy時代R語言學習的一些ABC
    主要就是寫一些和數據分析(或者用時髦的說法,數據科學)相關的內容。我是一個普通的數據工作者,統計學專業出身,在大學裡教過書,也做過一些實際數據工作。數據科學於我而言,可以算工作也可以算一種愛好。這個號用到的主要數據工具是R語言。原因很簡單,我用R用了11年,順手。
  • R語言必知必會之tidyverse(一):管道操作
    徵得張敬信老師同意,本號將轉載張老師關於R語言tidyverse包一系列文章,為大家進行醫學研究提供助力。
  • tidyverse —— readr包
    tidyverse默認用utf-8進行編碼。對於要進行解析的字符串,要先弄清楚原碼。l1 <- read.csv('F:/action/tidyverse/data/CSR_Finidx.csv', sep = ",", fileEncoding = "UTF-16")view(l1)
  • tidyverse —— readxl包
    readxl包,讀取Excel文件專用包,有和tidyverse核心包一樣的特點,快!效率特高!話說Hadley大叔出品就沒有效率低的,可能鍵盤是借來的,著急還。獨立性高,不外部依賴Java啥的,xls和xlsx文件讀取都可以。
  • Tidyverse|tidyr數據重塑之gather,spread(長數據寬數據轉化)
    長型數據和寬型數據在數據分析中非常常見 ,其中寬型數據更具可讀性,長型數據則更適合做分析
  • 從另一個視角看 R 語言的方言 Tidyverse
    •Tidyverse 來自這樣一種渴求,即要有一組相互兼容、行為一致的函數或包。這種「純正」哲學對計算機科學家有著難以抗拒的吸引力。Tidyverse 也借鑑了其它「純正」計算機科學(Computer Science,以下簡稱 CS)哲學,特別是 函數式編程(Functional Programming,以下簡稱 FP)。
  • 地理數據科學培訓班第一課之初識R語言
    直播信息:直播時間:2020 年 7 月 11 日晚上 9 點;地理數據科學培訓班開班啦R 和 RStudio 的安裝是非常簡單的,這裡提供一些安裝 Tips。在文章的最後我還通過一個案例帶大家走進奇幻的 R 世界。
  • R語言 | 數據操作dplyr包
    最初我也很奇怪dplyr這個奇怪的名字,我查到其中一種解釋library(tidyverse)## ── Attaching packages ────────────────────────────────────── tidyverse 1.3.0 ──
  • R語言空間數據分析學習筆記2——數據基本操作
    本節將會學習如何利用地理空間數據進行連接、篩選等操作,首先我們加載軟體環境和數據。
  • tidyverse —— forcats包
    生成因子R語言的base包中函數如dataframe等默認因子在分類變量讀入時就會生成,而tidyverse包中的readr等包則會保留數據讀入時的原樣不做改變,要生成因子則可以使用parse_factor函數進行處理。parse_factor函數更審慎一些,會對不在給定的因子水平中的變量取值一個警告,而base包中的factor則會直接將該值記為NA,不給出報錯或警告。
  • R語言數據清洗實戰——高效list解析方案
    往期回顧往期案例數據請移步本人GitHub:https://github.com/ljtyduyu/DataWarehouse/tree/master/Filelist是R語言中包容性最強的數據對象,幾乎可以容乃所有的其他數據類型
  • R 數據處理(四)
    R 數據處理(四)前言前面講過了 R 自帶的讀取矩陣型數據的方法,如 read.csv,read.table 等。下面我要介紹的是 tidyverse 中的 readr 包提供的讀取矩陣型數據的方式readr 的目標是提供一種快速友好的方式來讀取矩陣型數據,如 csv, tsv 和 fwf 等。使用1.