數據清理工具簡介(Tidyverse)

2021-03-02 友萬學院

記得有一個笑話:數據分析師的80%的時間,都消耗在數據清理上。很多時候數據處理不僅僅是效率的問題,有時候甚至沒辦法進行數據分析的操作。

為了加快數據清理的效率,同時為以後的建模和數據可視化做準備,R語言的Tidyverse包可以提供非常優秀的數據清理、整合和可視化的「一站式服務」。

本文將簡單介紹 Tidy 數據的思想以及舉例說明使用方法,本文所有的內容均為可重現研究(Reproducible research), 請點擊 閱讀原文 獲取相關數據及代碼。

Tidy 數據簡介 (Tidy data)

為了更好的分析數據,我們需要將數據整合成Tidy格式 (Fig. 1)。Tidy 格式主要思想是儘量減少不同觀測值之間的耦合,以保證:

[Tidy 數據介紹及圖片引自 R for Data Science by Hadley Wickham]

Tidy 數據也有自己的額外開銷(overhead), 例如數據表中可能存在一些重複的數值,浪費了存儲空間;不利於矩陣運算來加速計算效率。鑑於現在的電腦技術發展非常迅速,即使存在一些電腦資源的浪費,Tidy 數據對用戶更加友好,這些額外開銷是可以接受的。

安裝Tidy

首先安裝Tidyverse, 代碼如下所示。其實Tidyverse是一系列優秀軟體庫的合集,其中最常用的幾個package包括 dplyr,ggplot2 和 readr 等。

if (!require(tidyverse)){
 install.packages("tidyverse")
}

數據清理方法舉例

本文的數據來源是美國USGS發布的施肥量分析,由於這些數據是通過地理信息系統(GIS)生成的,不太符合Tidy數據的思想, 筆者簡單介紹數據清理的過程。首先讀入數據, 原始數據有2M左右,包含110列和3,111行。

# read in data.

require(tidyverse)
# county level data of fertilizer application.  
raw_data = read_csv("../data/CNTY_FERT_1987-2012.csv")
#head(raw_data)

a. 數字前增加一個零

有些數據前的零會被一些軟體自動省略,然而有些數據的位數非常重要。例如原數據的FIPSno代碼就要求是5位數字,所以需要在不夠五位數字的前加一個零,代碼如下所示:

# add leading zeros to fill in 5 digits.

raw_data %>%
 mutate(FIPS_no = str_pad(FIPSno, 5, pad = "0" )) %>%
 select(FIPS_no)

## # A tibble: 3,111 x 1
##    FIPS_no
##    <chr>  
##  1 01001  
##  2 01003  
##  3 01005  
##  4 01007  
##  5 01009  
##  6 01011  
##  7 01013  
##  8 01015  
##  9 01017  
## 10 01019  
## # ... with 3,101 more rows

b. 列名裡包含變量名

原始數據最大的特點就是列名也包含了數據,例如第7到第10列名稱為:「farmN1987」 「nonfN1987」 「farmN1988」 「nonfN1988」。列名中包括了類別 (farm 與 nonf), 肥料種類(N 與 P)和年份(1987)。

基本步驟包括:

移除不需要的信息,

將所有的施肥量數據放到一列,

將列名中的數據分離出來。

clean_data = raw_data %>%  # 移除不需要的信息.
 select(-c(FIPS_st, FIPS_co, FIPSno)) %>%  # 將寬型數據轉換成列數據。
 gather(Fert.Type, Quantity, farmN1987:nonfP2012) %>%  # 將三個變量(variables)分離出來。
 mutate(Year = str_sub(Fert.Type, start = -4),
        Nutrient = str_sub(Fert.Type, start = -5, end = -5),
        Farm.Type = str_sub(Fert.Type, start = 1, end = 4)
        ) %>%  # 移除不需要的數據
 select(-Fert.Type)

head(clean_data)

## # A tibble: 6 x 7
##   FIPS  State County  Quantity Year  Nutrient Farm.Type
##   <chr> <chr> <chr>      <int> <chr> <chr>    <chr>    
## 1 01001 AL    Autauga  1580225 1987  N        farm    
## 2 01003 AL    Baldwin  6524369 1987  N        farm    
## 3 01005 AL    Barbour  2412372 1987  N        farm    
## 4 01007 AL    Bibb      304592 1987  N        farm    
## 5 01009 AL    Blount   1825118 1987  N        farm    
## 6 01011 AL    Bullock   767573 1987  N        farm

c. 根據條件替換變量的數值

到這裡,數據已經基本已經滿足了Tidy 數據的要求。考慮到農場類型的兩個水平為farm 和 nonf, 尤其是nonf容易引起大家的誤解,筆者將所有的nonf 替換成 nonfarm.

clean_data = clean_data %>%
 # 將 nonf 替換成 nonfarm
 mutate(Farm.Type = ifelse(Farm.Type == "nonf",
                     "nonfarm", "farm"))

# 農場類型已經成功替換成了 nonfarm.
tail(clean_data$Farm.Type)

## [1] "nonfarm" "nonfarm" "nonfarm" "nonfarm" "nonfarm" "nonfarm"

數據可視化舉例

整理後的數據可以很方便的進行數據可視化,筆者以ggplot2為例來示範Tidy數據的可視化應用。例如我們可以列出2003年美國磷肥肥施用量最多的10個州,如下圖所示。

Take-home points

The end, thanks for reading.

專注分享商業數據分析、金融數據分析、應用統計分析、知識圖譜、機器學習、計量經濟、人工智慧、網絡爬蟲、自動化報告與可重複研究等熱門技術內容。定向培養Stata、Python、R語言數據人才,助力產學研政企商協同發展,為中國大數據產業蓄能。合作熱線:010-56451129 郵箱:info@uone-tech.cn。

相關焦點

  • 從Tidyverse學起!
    那麼,tidyverse就提供了一個很好的學習思路(tidyverse first),讓我們先忽略編程這道大關,其理念是一開始不談向量、矩陣、數據框、因子、流程控制等概念,直接從數據的操縱入手,讓初學者在最短時間內學會數據的處理與可視化應用。
  • 【tidyverse】R中的tidyverse入門
    tidyverse是由RStudio首席科學家Hadley Wickham開發的R套裝的集合。這些包作為大數據分析管道的一部分可以很好地協同工作。要了解這些工具及其協同工作的更多信息,請閱讀R for data science。 對於R的新手,請查看我之前的Storybench教程:RStudio筆記本中的R入門。以下教程將介紹tidyverse中用於構建和分析數據集的一些基本功能。
  • 【數據管理】Tidyverse:R 語言學習之旅的新起點
    2 您用tidyverse包嗎?學習R語言的傳統路徑(base R first)多是從變量類型、數據結構、流程控制、循環與自定義函數,也就是以R程式設計作為起點,接著依照數據處理、視覺化、統計與機器學習等應用偏好延續下一個學習的旅程;由tidyverse
  • R語言 | Tidyverse包入門介紹
    事到如今,依舊有「數據處理,Python和R到底學哪個」的爭辯。今天,我們講一個「讓R能夠和Python在數據處理方面一較高下」的擴展包:tidyverse包。你可以直接調用tidyverse,也可以調用它所轄屬的包。下面,我們講解一些tidyverse中可能使用到的函數,幫助你快速上手這個方便的東西。同時,我們會比較tidyverse和base R之間的不同之處,幫助你更快理解,為什麼tidyverse受到更多的推崇。
  • [R數據科學]tidyverse數據清洗案例詳解
    介紹本中你將學習在R中數據處理簡潔的方法,稱為tidy data。將數據轉換為這種格式需要一些前期工作,但這些工作從長遠來看是值得的。一旦你有了整潔的數據和一些包提供的整潔工具,您將花費很少時間將數據從一種表示轉換到另一種,從而可以將更多的時間花在分析問題上。
  • R語言入門教程 | tidyverse包之數據處理
    包,《R語言實戰》並未涉及,這也導致R語言的學習難度增加,今天我們給大家引入tidyverse包的學習。tidyverse 包是 Hadley Wickham 及團隊的集大成之作,是專為數據科學而開發的一系列包的合集, 基於整潔數據,提供了一致的底層設計、語法、數據結構,包括數據導入,數據規整,數據處理,可視化,建模以及形成可重複性報告數據分析的全流程。
  • tidyverse —— readxl包
    readxl包,讀取Excel文件專用包,有和tidyverse核心包一樣的特點,快!效率特高!話說Hadley大叔出品就沒有效率低的,可能鍵盤是借來的,著急還。獨立性高,不外部依賴Java啥的,xls和xlsx文件讀取都可以。
  • tidyverse —— readr包
    tidyverse默認用utf-8進行編碼。對於要進行解析的字符串,要先弄清楚原碼。以我被數據虐待這麼些年的經驗來看,這麼點數據有886kb的大小很不正常,八成藏著什麼弔詭的字符要虐我一下,而且數據間隔很不均勻,一看就不是正經的用制表符或者逗號間隔的文件。試著讀一下。
  • R語言學習指南(3) tidyverse的基礎使用
    tidyverse是為數據科學設計的R軟體包,它包含(ggplot2、dplyr、tidyr、stringr、magrittr、tibble)等一系列熱門軟體包,學好tidyverse的使用可也讓你站上另一個高度,從而高效的處理數據,因此本文檔不僅僅做一些案例介紹,而是希望以較為正確的學習方法來介紹R語言,使大家少走彎路,快速入門掌握R語言
  • R語言必知必會之tidyverse(一):管道操作
    徵得張敬信老師同意,本號將轉載張老師關於R語言tidyverse包一系列文章,為大家進行醫學研究提供助力。
  • Tidyverse|tidyr數據重塑之gather,spread(長數據寬數據轉化)
    長型數據和寬型數據在數據分析中非常常見 ,其中寬型數據更具可讀性,長型數據則更適合做分析
  • tidyverse —— forcats包
    作者簡介
  • Tidy時代R語言學習的一些ABC
    在R語言所有的新發展當中,tidyverse無疑是最為耀眼的一個。tidyverse系列R包由Hadley Wickham開發,強化了R的數據處理和數據分析框架,大幅提升了便利性和效率。而且,由於tidyverse的易用性,大量的新R包以它為基礎進行開發,或者以它為標準對過去的R包進行整合。
  • 強大的數據清理大師:dplyr
    。install.packages("dplyr")library(dplyr)或者直接安裝載入tidyverse(評書演義:《R for Data Science》):install.packages
  • 從另一個視角看 R 語言的方言 Tidyverse
    作者簡介作者 Norm Matloff 為 UC Davis 計算機科學教授(曾任 UCD 統計學教授)。中文翻譯及投稿至 COS 經過作者同意[1]。文中的「我」為作者視角,但譯文中存在的任何不妥之處當然很可能是由譯者引入的,還望讀者不吝賜教[2]。注意:此為簡版在我看來,Tidyverse 的主要問題在於其不利於教學。
  • R語言 | 數據操作dplyr包
    [更新~] Python網絡爬蟲與文本數據分析公眾號只帶著Python字眼,卻分享著R語言,不務正業,任性了~dplyr簡介dplyr是R語言的數據分析包,很像python中的pandas,能對dataframe
  • R語言空間數據分析學習筆記2——數據基本操作
    本節將會學習如何利用地理空間數據進行連接、篩選等操作,首先我們加載軟體環境和數據。
  • R數據科學--初見
    終於你跨越茫茫宇宙,來到生信星球,發現了初學者的新大陸前些天豆豆花花各入手一本學R必備的神書《R數據科學》,花花完結了零基礎入門R語言系列和ggplot系列。現在開始跟著這本書的思路走,仔細端詳R語言。如果你還不了解這本書,👇看這裡。
  • R語言如何檢測和處理數據缺失值?
    這篇文章,總結和分享R語言如何檢測數據中的缺失值,以及針對不同情形下處理缺失值的方法。R語言可以使用is.na()函數來判斷數據集的取值是否為缺失值,並且利用一些匯總函數可以概述數據整體的缺失率、每個樣本的缺失率和每個變量的缺失率。R語言也提供可視化工具來直觀展示變量的缺失分布情況。
  • tidyverse —— stringr包
    作者簡介野菜糰子,