《R的極客理想》系列圖書作者張丹:R語言數據科學新類型tibble
張丹,R語言中文社區專欄特邀作者,《R的極客理想》系列圖書作者,民生銀行大數據中心數據分析師,前況客創始人兼CTO。
個人博客:http://fens.me, Alexa全球排名70k。
前言
最近正在整理用R語言進行數據處理的操作方法,發現了 RStudio 公司開發的數據科學工具包tidyverse,一下子就把我吸引了。通過2天時間,我把tidyverse項目整體的學了一遍,給我的啟發是非常大的。tidyverse 重新定義了數據科學的工作路徑,而且路徑上每個核心節點,都定義了對應的R包。這真是一項造福數據分析行業的工程,非常值得稱讚!!
tidyverse個項目,包括了一系列的子項目,其中tibble被定義為取代傳統data.frame的數據類型,完全有顛覆R的數據操作的可能。跟上R語言領袖的腳步,領先進入數據科學新的時代。
目錄
tibble介紹
tibble安裝
tibble包的基本使用
tibble的源代碼分析
1. tibble介紹
tibble是R語言中一個用來替換data.frame類型的擴展的數據框,tibble繼承了data.frame,是弱類型的,同時與data.frame有相同的語法,使用起來更方便。tibble包,也是由Hadley開發的R包。
tibble對data.frame做了重新的設定:
tibble,不關心輸入類型,可存儲任意類型,包括list類型
tibble,沒有行名設置 row.names
tibble,支持任意的列名
tibble,會自動添加列名
tibble,類型只能回收長度為1的輸入
tibble,會懶載入參數,並按順序運行
tibble,是tbl_df類型
tibble的項目主頁:https://github.com/tidyverse/tibble
2. tibble安裝
本文所使用的系統環境
Win10 64bit
R: 3.2.3 x86_64-w64-mingw32/x64 b4bit
tibble是在CRAN發布的標準庫,安裝起來非常簡單,2條命令就可以了。
RStudio官方把tibble項目,集成到了tidyverse項目中了,官方建議直接安裝tidyverse項目,這樣整個用來做數據科學的庫都會被下載下來。
tidyverse項目,是一個包括了數據科學的一個集合工具項目,用於數據提取,數據清理,數據類型定義,數據處理,數據建模,函數化編程,數據可視化,包括了下面的包。
ggplot2, 數據可視化
dplyr, 數據處理
tidyr, 數據清理
readr, 數據提取
purrr, 函數化編程
tibble, 數據類型定義
tidyverse項目的地址:https://github.com/tidyverse/tidyverse。高效的使用R語言做數據科學,請參考開源圖書 R for Data Science(http://r4ds.had.co.nz/).
3. tibble包的基本使用
對於tibble包的使用,主要需要掌握創建、數據轉型、數據查看、數據操作、與data.frame的區別點。複雜的數據處理功能,是dplyr項目來完成,下一篇講dplyr的文章再給大家介紹。
3.1 創建tibble
創建一個tibble類型的data.frame是非常簡單的,語法與傳統的data.frame是類似的。
從上面的輸出可以看到tibble類型,會在輸出時多一行,用來指定每一列的類型。
tibble用縮寫定義了7種類型:
int,代表integer
dbl,代表double
chr,代表character向量或字元串。
dttm,代表日期+時間(a date + a time)
lgl,代表邏輯判斷TRUE或者FALSE
fctr,代表因子類型factor
date,代表日期dates.
查看類型,發現tbl_df繼承了tbl繼承是data.frame,所以tibble是data.frame的子類型。
讓我們多角度來觀察t1變數。
通過文本排列來創建一個tibble
通過vector創建tibble
通過data.frame創建tibble,這時就會報錯了。
通過list創建tibble
我們看到tibble其實是存儲list類型,這是data.frame做不到的。
通過一個tibble,創建另一個tibble,這時也會報錯了。
3.2 數據類型轉換
tibble是一個新的類型,R語言中大部分的數據都是基於原有的數據類型,所以原有數據類型與tiblle類型的轉換就顯的非常重要了。
把一個data.frame的類型的轉換為tibble類型
我們可以看到tibble與data.frame的轉型是非常平滑的,一個轉型函數就夠,不需要中間做任何的特殊處理。
把一個vector轉型為tibble類型,但是不能再轉回vector了。
把list轉型為tibble。
tibble與list的轉型也是非常平滑的,一個轉型函數就夠。
把matrix轉型為tibble。
從上面的轉型測試可以看到,tibble類型是非常友好的,可以與data.frame, list, matrix 進行相互轉型操作。tibble與vector是不能進行直接轉型的,這與data.frame的行為是一致的,如果需要轉型,我們可以分別取出每一列進行拼接,或轉為matrix再操作。
3.3 tibble數據查詢
通常我們是str()函數來觀察數據的靜態組成結果,在tibble包提供了一個glimpse(),可以方便我們來觀察tibble和data.frame類型的數據。
比較glimpse()和str()對於data.frame的數據查看輸出
比較glimpse()和str()對於tibble的數據查看輸出。
按列出數據,一層[]返回的結果還是tibbe,二層[]與$返回的結果為列組成的向量。
按行取數據,這時一定要用,來做分隔符
3.4 tibble數據操作
增加一列。
增加一行,還是基於上面生成的df變數。
3.5 tibble與data.frame的區別
列名,可以自由定義,並且會自動補全。
數據,按順序執行懶載入。
列印輸出控制,tibble的列印控制被重寫了,所以執行print()函數時,模型會先進行類型匹配,然後調用print.tbl()。
3.7 特殊的函數
lst,創建一個list,具有tibble特性的list。 lst函數的工作原理,類似於執行[list()],這樣的操作。
enframe,快速創建tibble。enframe提供了一個模板,只有2列name和value,快速地把2個向量匹配的tibble中,可以按行生成或按列生成。
deframe,把tibble反向轉成向量,這個函數就實現了,tibble到向量的轉換。它默認把name列為索引,用value為值。
3.8 用於處理data.frame函數
tibble還提供了一些用於處理data.frame的函數。
這些data.frame的工具函數,我猜是用於data.frame到tibble的數據類型轉換用的,因為tiblle是沒有行名的。
4. tibble的源代碼分析
對於tibble包的深入理解,我們需要分析tibble包底層的源代碼,以及設計原理。我們打開github上是tibble項目,找到tibble.R(https://github.com/tidyverse/tibble/blob/master/R/tibble.R)的源代碼,先來了解一下tibble類型的定義。
找到tibble函數的定義:
tibble函數的構成是非常簡單地,用quos()和lst_quos()函數來分割參數,再用as_tibble()函數,生成tibble類型。
我們再找到as_tibble函數的定義:
這個函數是一個S3類型的函數,可以S3面向對象類型的方法,來查找tibble相關的重寫的函數。關於S3類型的詳細介紹,請參與文章R語言基於S3的面向對象編程(http://blog.fens.me/r-class-s3/)。
利用S3的查詢函數,把整個tibble類型定義的泛型化函數都找到了。
接下來,我們繼續到tbl_df(https://github.com/tidyverse/tibble/blob/master/R/tbl-df.r)的類型的定義
最後,這樣就明確了tbl_df是類的定義,包括了屬性和方法,而tibble是實例化的對象。通過對tibble函數的源代碼分析,了解tibble本身的結構是怎麼樣的。
※為「Tidyverse」瘋狂打call!
※初學者如何避免bug:RStudio代碼實時錯誤提示功能
TAG:R語言中文社區 |