當前位置:
首頁 > 最新 > 《R的極客理想》系列圖書作者張丹:R語言數據科學新類型tibble

《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本身的結構是怎麼樣的。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 R語言中文社區 的精彩文章:

為「Tidyverse」瘋狂打call!
初學者如何避免bug:RStudio代碼實時錯誤提示功能

TAG:R語言中文社區 |