R----dplyr包介紹學習


dplyr包:plyr包的替代者,專門面對數據框,將ddplyr轉變為更易用的接口

%>%來自dplyr包的管道函數,其作用是將前一步的結果直接傳參給下一步的函數,從而省略了中間的賦值步驟,可以大量減少內存中的對象,節省內存,可惜的是應用范圍還不是很廣。

dplyr和data.table(易於操作數據)是R的兩個高效數據處理包,這兩個包有它們各自的優點。

data.table在語法靈活性和performance上面更深一籌,dplyr則在易學性和SQL語句轉換方面有獨到之處

首先dplyr提供了一個符號%>%,該符號將左邊的對象作為第一個參數傳遞到右邊的函數中,這樣就實現類似unix管道的編程風格,代碼更易讀。

dplyr很好地解決了base包中的幾個數據處理的痛點,具體可以參考本系列01。

首先,dplyr可以方便地抽取數據框的子集。抽取行的子集函數有filterdistinctsample_fracsample_nslicetop_n。抽取列的子集函數是select,可通過列名或選項函數進行選擇,常見的選項函數有contains(“.”)ends_with(“Length”)starts_with(“Sepal”)everything()matches(“.t.”)num_range(“x”, 1:5)one_of(c(“Species”, “Genus”))

其次,dplyr還提供了函數arrange,方便按照某一列進行數據排序

1
2
arrange(mtcars, mpg) # 從低到高
arrange(mtcars, desc(mpg)) # 從高到低

然后,dplyr可以方便地進行數據集的合並,取代merge函數。

1
2
3
4
5
6
left_join(a, b, by="x1")
right_join(a, b, by="x1")
inner_join(a, b, by="x1")
outer_join(a, b, by="x1")
semi_join(a, b, by="x1") # 數據集a中能與數據集b匹配的記錄
anti_join(a, b, by="x1") # 數據集a中雨數據集b不匹配的記錄

 

dplyr還提供了intersection、union和setdiff用於獲得兩個數據集的交集、並集和差集。

最后,dplyr可以方便地進行數據集的拼接。bind_rows(y, z)將數據集z按行拼接到數據集y中,bind_cols(y, z)將數據集z按列拼接到數據集y中。

本系列03介紹plyr時,知道這個包最主要地是用來做分組處理,dplyr對此功能進行了升級,詳述如下。

dplyr可以方便地對數據框進行概述,相當於ddply中的summarize。summarise(iris, avg=mean(Sepal.Length))將數據概括為單行結果輸出;summarise_each(iris, funs(mean))對每一列運行概述函數。支持的概述函數有firstlastnthnn_distinctminmaxmeanmedianvarsd

dplyr可以方便地創建新變量,相當於ddply中的transform。mutate(iris, sepal=Sepal.Length+Sepal.Width)計算並添加一個或多個新列。mutate_each(iris, funs(min_rank))對每一列運行窗口函數。常見的窗口函數有row_numbermin_rankpercent_rankcumsum等。

dplyr提供了一個分組函數group_by,把分組依據相同的數據組合成行,相當於ddply中的group_vars。ungroup用於移出數據框的分組信息。配合上管道符號,可以方便地進行分組概述和分組計算。

1
2
iris %>% group_by(Species) %>% summarise(...)
iris %>% group_by(Species) %>% mutate(...)

強大的dplyr包實現數據預處理

工作中的數據分析或挖掘任務都需要進行各種各樣的數據預處理,包括數據整合、關聯、排序、篩選等。下面將介紹強大的dplyr包,其可以非常靈活、快速的實現數據的預處理。

select(): 按列變量選擇
filter(): 按行名稱分片
slice(): 按行索引分片
mutate(): 在原數據集最后一列追加一些數據集
summarise(): 每組聚合為一個小數量的匯總統計,通常結合gruop_by()使用
arrange(): 按行排序

#tbl對象

使用dplyr包預處理時建議使用tbl_df()函數或tbl_cube()函數或tbl_sql()函數將原數據轉換為tbl對象,因為dplyr包用C語言開發,對處理tbl對象是非常迅速的。語法:

tbl_df(src, ...)

tbl_cube(dimensions, measures)

tbl_sql(subclass, src, from, ..., vars = attr(from, 'vars'))

 

#觀測篩選

如果需要將數據集中的某些觀測進行篩選的話,可以使用filter()函數,語法如下:

filter(.data, ...)

.data為tbl對象

...為觀測篩選條件,類似於subset()函數中的用法,但不同的是filter()函數不能篩選某些變量。

例子:

df <- data.frame(x = c('a','b','c','a','b','e','d','f'), y = c(1,2,3,4,5,6,7,8))

df2tbl <- tbl_df(df)

filter(df2tbl,x %in% c('a','b'))

 

#變量選取

filter()函數只能將指定條件的觀測篩選出來,並不能篩選出只關心的變量,為了彌補這個缺陷,可以使用select()函數篩選指定的變量,而且比subset()函數更靈活,而且選擇變量的同時也可以重新命名變量。如果剔除某些變量的話,只需在變量前加上負號“-”。之所以說他比subset()函數靈活,是因為可以在select()函數傳遞如下參數:

 

starts_with(x, ignor.case = TRUE)#選擇以字符x開頭的變量

ends_with(x, ignor.case = TRUE)#選擇以字符x結尾的變量

contains(x, ignor.case = TRUE)#選擇所有包含x的變量

matches(x, ignor.case = TRUE)#選擇匹配正則表達式的變量

num_range('x', 1:5, width = 2)#選擇x01到x05的變量

one_of('x','y','z')#選擇包含在聲明變量中的

everything()#選擇所有變量,一般調整數據集中變量順序時使用

 

例子:

#將df2tbl數據集中的y變量放到x變量前

select(df2tbl,y,everything())

#篩選變量的同時,重新命名變量名

select(df2tbl, x1 = x, y1 = y)

 

#重命名變量

如果需要對數據集中的某些變量進行重命名的話,可直接使用rename()函數,語法如下:

rename(tbl, newname = oldname,...)

例子:

rename(df2tbl, x1 = x, y1 = y)

 

#數據排序

數據預處理過程中往往也需要按某些變量進行排序,dplyr包提供了非常便捷的arrange()函數實現排序功能,語法如下:

arrange(.data, ...)

arrange()函數默認以某個變量進行升序,如需降序則desc(var_name)即可。

例子:

arrange(df2tbl, y) #默認升序

arrange(df2tbl, desc(y)) #降序操作

 

#數據擴展

通過mulate()函數可以在原始數據集的基礎上擴展新變量,類似於transform()函數,語法如下:

mutate(.data, ...)

例子:

mutate(df2tbl, z = y^2 + y - 10)

同樣可以進行數據擴展的還有transmute()函數,與mutate()函數不同的是,該函數擴展新變量的同時,將刪除所有原始變量。

例子:

transmute(df2tbl, z = y^2 + y - 10)

 

#數據聚合

在數據庫操作中,往往需要進行聚合函數的應用,這里同樣可以很方面使用summarize()函數實現數據集聚合操作,語法如下:

summarize(.data, ...)

可以用來聚合的函數有:

 

min():返回最小值

max():返回最大值

mean():返回均值

sum():返回總和

sd():返回標准差

median():返回中位數

IQR():返回四分位極差

n():返回觀測個數

n_distinct():返回不同的觀測個數

first():返回第一個觀測

last():返回最后一個觀測

nth():返回n個觀測

 

例子:

summarize(df2tbl, max(y))

summarize(df2tbl, n())

 

而且該函數還可以結合group_by()函數實現分組聚合,group_by()函數語法:

group_by(.data, ..., add = FALSE)

例子:

summarize(group_by(df2tbl,x), sum(y))

 

#數據關連

我們知道,數據庫中經常需要將多個表進行連接操作,如左連接、右連接、內連接等,這里dplyr包也提供了數據集的連接操作,具體如下:

inner_join#內連
left_join#左連
right_join#右連
full_join#全連
semi_join#返回能夠與y表匹配的x表所有記錄
anti_join#返回無法與y表匹配的x表的所記錄
intersect(x, y): x 和 y 的交集(按行)
union(x, y): x 和 y 的並集(按行)
setdiff(x, y): x 和 y 的補集 (在x中不在y中)

例子:

df2 <- data.frame(x = c('a','b','c'), z = c('A','B','C'))

df2tbl2 <- tbl_df(df2)

inner_join(x = df2tbl, y = df2tbl2, by = 'x')

semi_join(x = df2tbl, y = df2tbl2, by = 'x')

anti_join(x = df2tbl, y = df2tbl2, by = 'x')

 

#數據合並

在R基礎包里有cbind()函數和rbind()函數實現按列的方向進行數據合並和按行的方向進行數據合並,而在dplyr包中也添加了類似功能的函數,它們是bind_cols()函數和bind_rows()函數

例子:

mydf1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))

mydf2 <- data.frame(x = c(5,6), y = c(50,60))

mydf3 <- data.frame(z = c(100,200,300,400))

bind_rows(mydf1, mydf2)

bind_cols(mydf1, mydf3)

需要說明的是,bind_rows()函數需要兩個數據框或tbl對象有相同的列數,而bind_cols()函數則需要兩個數據框或tbl對象有相同的行數。

 

#管道函數

這里介紹一種dplyr包中特有的管道函數,即通過%>%將上一個函數的輸出作為下一個函數的輸入。

例子:根據數據集df2tbl和df2tbl2,取出z變量對應的最大y值

inner_join(x = df2tbl, y = df2tbl2, by = 'x') %>% group_by(., z) %>% summarize(., max(y))

 

#連接數據庫數據

如果需要獲取MySQL數據庫中的數據時,可以直接使用dplyr包中的src_mysql()函數,其功能類似於RMySQL包。src_mysql()函數語法如下:

src_mysql(dbname, host = NULL, port = 0L, user = "root", password = "",

...)

通過以上方式連接MySQL數據庫后,使用tbl()函數獲取數據集,tbl()函數語法如下:

tbl(src,from = '')

src為src_mysql()函數對象

from為SQL語句

例子:

src <- src_mysql('test', host = 'localhost', user = 'root', password = 'snake')

src

#獲取指定表中的數據

tbl(src, from = 'diff')


轉載自:強大的dplyr包實現數據預處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM