前言
接下來的部分,我們主要介紹 R 的一個用於資料科學的整合包 tidyverse,並用它所包含的各種 R 包來進行資料處理。
tidyverse 中所有的包具有同樣的設計理念、語法以及資料結構
主要包含如下 R 包:包名描述ggplot2鼎鼎大名的畫圖包,不用過多介紹dplyr提供了一組便利的資料操作語法tidyr資料的整潔之道readr提供便利的方式讀取矩陣資料(如 csv, tsv 和 fwf 等)purrr增強 R 的函式程式設計,避免 for 迴圈tibble對 data.frame 的升級封裝stringr處理字串,前面已經介紹過forcats對 factor 替代
還有一些讀取其他資料檔案的包,如DBI: 關係資料庫haven: SPSS, Stata, 和 SAS 資料.httr: 網路 APIreadxl: .xls 和 .xlsx 檔案rvest: 網路爬蟲.jsonlite: JSON 資料xml2: XML 檔案處理時間資料的lubridate: 時間和日期hms: 持續時間或時間值,並以 hh:mm:ss 格式顯示它們。blob: 二進位制資料提高程式設計效率magrittr: 提供了一系列的管道運算子,接下來我們要詳細介紹glue: paste 的替代,更容易的資料和字串的組合magrittr介紹magrittr 包定義了一組高效的管道操作工具包,透過管道的連線方式,讓資料或表示式的傳遞更高效
從左到右構造資料操作序列(而不是從內到外)避免函式巢狀最小化對區域性變數和函式定義的需求使在操作序列中的任意位置新增步驟變得容易安裝匯入安裝直接安裝 tidyverse,會將該包下的所有包都裝上,就不用一個個安裝了
# The easiest way to get magrittr is to install the whole tidyverse:install.packages("tidyverse")
如果你不想全部安裝,只想要 magrittr 一個包,或其中幾個包
# Alternatively, install just magrittr:install.packages("magrittr")
安裝開發版
# Or the development version from GitHub:# install.packages("devtools")devtools::install_github("tidyverse/magrittr")
匯入全部匯入
library(tidyverse)
匯入一個包
library(magrittr)
使用
magrittr 主要包括 4 個管道運算子:
%>%: 向右運算子%T>%: Tee 運算子,向左運算子%$%: 解釋運算子%<>%: 複合賦值管道運算子1. %>%將左邊的結果傳遞給右邊的函式作為第一個引數值,其結果可以繼續向右邊傳遞
基本管道操作x %>% f => f(x)x %>% f(y) => f(x, y)x %>% f %>% g %>% h => h(g(f(x)))預設將 %>% 左邊的 x 作為右邊的(如 f 函式)的第一個引數
示例
> x <- 3> f <- function(x, y=1) { return(x+y) }> x %>% f[1] 4> x %>% f(2)[1] 5
引數佔位符x %>% f(y, .) => f(y, x)x %>% f(y, z = .) => f(y, z = x)使用 . 佔位符,表示管道左邊傳過來的變數
> x %>% f(y = .,x = 5)[1] 8> x %>% f(y = 3,x = .)[1] 6
對屬性重用佔位符
在右側表示式中可以多次使用佔位符。但是,當佔位符僅出現在巢狀表示式中時,magrittr 仍將應用第一個引數規則。因為在大多數情況下,這會產生更乾淨的程式碼
x %>% f(y = nrow(.), z = ncol(.)) => f(x, y = nrow(x), z = ncol(x))
可以透過將右側表示式用大括號包裹來取消這一規則
x %>% {f(y = nrow(.), z = ncol(.))} => f(y = nrow(x), z = ncol(x))
示例:
> x <- matrix(1:12, nrow = 3, ncol = 4)> f<- function(x, y, z) { return(x * y * z) }> x %>% f(y = nrow(.), z = ncol(.)) [,1] [,2] [,3] [,4][1,] 12 48 84 120[2,] 24 60 96 132[3,] 36 72 108 144> x %>% {f(y = nrow(.), z = ncol(.))}Error in f(y = nrow(.), z = ncol(.)) : 缺少引數"x",也沒有預設值> x %>% {f(1, y = nrow(.), z = ncol(.))}[1] 12
繫結函式任何以 . 開頭的管道序列將會返回一個一元函式
f <- . %>% cos %>% sin # is equivalent to f <- function(.) sin(cos(.))
傳遞到程式碼塊
> rnorm(10) %>% multiply_by(5) %>% add(5) %>%+ {+ print("Mean:", mean(.))+ sort(.) %>% head(5)+ }[1] "Mean:"[1] -0.7076385 -0.3230133 0.9298034 0.9390084 2.5007525
傳遞到函式
> rnorm(10) %>% add(1) %>% `*`(10) %>%(+ function(x) {+ if (x[1] > 5) {+ x-5+ } else x+ }+ ) [1] -5.056051 5.214681 16.122495 22.311603 22.431362 15.828250 1.785964 -2.969273 26.003416[10] 12.304749
2. %T>%與 %>% 的區別是其結果不能向右傳遞,而是將 %T>% 左邊的結果繼續向右傳遞下去,%T>% 通常用來輸出圖形、列印結果到螢幕或者輸出到檔案,然後繼續後面的 %>% 操作
而其左邊的值相當於做了兩次傳遞,分別傳遞給 %T>% 右側表示式以及其後面的 %>% 管道符的右側表示式。
也可以理解為在一串管道序列中插入了一個操作,但並不會影響其後續的管道序列
示例:
> a <- 5> a %>% cos %T>% print %>% sin[1] 0.2836622[1] 0.2798734> x %>% cos %T>% hist %>% sin [,1] [,2] [,3] [,4][1,] 0.5143953 -0.6080830 0.6844888 -0.744023079[2,] -0.4042392 0.2798734 -0.1449872 0.004425684[3,] -0.8360219 0.8192892 -0.7901969 0.747209958
3. %$%通常左邊是資料框,%$% 右邊的函式可直接使用該資料框中的變數
示例:
> x <- matrix(1:12, nrow = 3, ncol = 4)> data.frame(x=x[,1], y=x[,2], z=x[,3]) %$% .[which(x > 5),][1] x y z<0 行> (或0-長度的row.names)> data.frame(x=x[,1], y=x[,2], z=x[,3]) %$% .[which(y > 5),] x y z3 3 6 9
相當於
> df <- data.frame(x=x[,1], y=x[,2], z=x[,3])> df[which(df$y>5),] x y z3 3 6 9
4. %<>%只能出現在所有管道符的第一個,用於在一長串處理管道操作之後直接將值賦值到最左邊的物件上
示例:
> a <- 1:10> print(a) [1] 1 2 3 4 5 6 7 8 9 10> a %<>% exp %>% sqrt> print(a) [1] 1.648721 2.718282 4.481689 7.389056 12.182494 20.085537 33.115452 54.598150 90.017131[10] 148.413159
可以看出,a 的值變為 sqrt(exp(a))
通用函式運算子除了上面 4 個主要的管道符之外,還重新定義了一些函式運算子,如下
示例
> seq(10) %>% `*`(5) %>% `+`(5) [1] 10 15 20 25 30 35 40 45 50 55> seq(10) %>% multiply_by(5) %>% add(5) [1] 10 15 20 25 30 35 40 45 50 55