dplyr包實現(xiàn)數(shù)據(jù)的清洗處理,包括數(shù)據(jù)整合、關(guān)聯(lián)、排序、篩選、匯總、分組等。
1)安裝、加載dplyr包、準備數(shù)據(jù)
install.packages("dplyr") #加載dplyr包
library(dplyr) ?#載入dplyr包
使用dplyr包處理數(shù)據(jù)前,建議先將數(shù)據(jù)集轉(zhuǎn)換為tbl對象。
data(iris) ?#本文使用iris示例數(shù)據(jù)集。
class(iris) ?#簡單查看數(shù)據(jù)集
head(iris)
iris<-tbl_df(iris) ? ?#轉(zhuǎn)化tbl對象
2)數(shù)據(jù)記錄篩選(行篩選)
filter函數(shù):按指定條件篩選符合條件中邏輯判斷要求的數(shù)據(jù)記錄。
filter(iris, Sepal.Length == 7)
Q:篩選花萼長大于7,花萼寬帶大于等于3的數(shù)據(jù)?
filter(iris, Sepal.Length > 7 & Sepal.Width>3.0)
Q:篩選出Species 為setosa或virginica的行
filter(iris,Species %in% c("setosa","virginica"))
3)變量篩選(列)
select函數(shù):可以通過指定列名選擇指定的變量進行分析,得到的為選擇的列。
select(iris,Sepal.Width,Petal.Length,Species)
其他特殊選擇,可匹配:
select(iris,contains("." )) #選取名稱中含有字符的列
select(iris,ends_with("Length")) #選取名稱以指定字符串結(jié)尾的列
select(iris,starts_with("Sepal")) #選取名稱以指定字符串為開頭的列
select(iris,Sepal.Length:Petal.Width) #選取在Sepal.Length和Petal.Width之間的所有列(包含Sepal.Length和Petal.Width)
select(iris,-Species) #選取除Species以外的所有列
Select(iris,……)
區(qū)別:Filter&Select
Filter:通過一些準則選擇觀測值(行)
Select:通過名字來選擇變量(列)
更名變量名: Select ?& ?Rename
head(select(iris,Sepal.W=Sepal.Width)) #只會保留選擇的變量
head(rename(iris,Sepal.W=Sepal.Width)) #保留所有變量,可以用來改名
4)數(shù)據(jù)排序(重要,大小,去除異常值)
arrange函數(shù)按給定的列名進行排序,默認為升序排列,也可以對列名加desc()進行降序排序。
arrange(iris,Sepal.Length) # 將數(shù)據(jù)按照Sepal.Length升序排序
Q:將數(shù)據(jù)Sepal.Length先升序,后Sepal.Width降序排序:
arrange(iris,Sepal.Length,desc(Sepal.Width))
5)變量變換/重構(gòu)
mulate()函數(shù)可以數(shù)據(jù)拓展,也可以在保留原變量的基礎(chǔ)上增加變量,進行數(shù)據(jù)處理。
mutate(iris,sepal = Sepal.Length + Sepal.Width)
transmute()函數(shù)在擴展新變量的時候,會刪除所有原始變量。
transmute(iris,sepal = Sepal.Length + Sepal. Width) #計算一個或多個新列并刪除原列
6)數(shù)據(jù)匯總
summarize()函數(shù)實現(xiàn)數(shù)據(jù)集聚合操作,將多個值匯總成一個值
summarise(iris,avg = mean(Sepal.Length))
利用概述函數(shù)概括數(shù)據(jù),輸入數(shù)值向量而返回單一數(shù)值:
first 向量的第一個值。
last 向量的最后一個值。
IQR 向量的IQR(四分位距) 。
Min ;Max Mean ;Median ;Var ;Sd等
summarise(iris, max(Petal.Width), first(Sepal.Width)) #返回數(shù)據(jù)框中變量的最大值及第一四分位值
7)數(shù)據(jù)分組
group_by函數(shù)對數(shù)據(jù)進行分組后,結(jié)合summarize函數(shù),可以對分組數(shù)據(jù)進行匯總統(tǒng)計。
Q:按品種分組,分別計算花萼寬度的均方差
summarise(group_by(iris,Species),sd=sd(Petal.Width))
8)連接操作符
dplyr包里還新引進了一個操作符,%>%, 使用時把數(shù)據(jù)集名作為開頭, 然后依次對此數(shù)據(jù)進行多步操作。
iris %>%group_by(Species) %>% summarise(sd=sd(Petal.Width)) #iris數(shù)據(jù)集,按Species分組,匯總Petal.Width的sd值,
iris %>%group_by(Species) %>% mutate(sepal = Sepal.Length + Sepal.Width)
9)抽樣
sample_n()隨機抽取指定數(shù)目的樣本,sample_frac()隨機抽取指定百分比的樣本,默認都為不放回抽樣,通過設(shè)置replacement =TRUE可改為放回抽樣,可以用于實現(xiàn)Bootstrap抽樣。
sample_n(mtcars, 50, replace = TRUE) #隨機有重復的取50行數(shù)
sample_frac(mtcars, 0.1, weight = 1 / mpg) #隨機無重復的以1/mpg值做權(quán)重取10%的數(shù)據(jù)
10)數(shù)據(jù)聯(lián)結(jié)
dplyr包也提供了數(shù)據(jù)集的連接操作,如左連接、右連接、內(nèi)連接等:
inner_join(x,y,by = NULL) ?#內(nèi)連接,合并數(shù)據(jù)僅保留匹配的記錄
left_join(x,y,by = NULL) ?#左連接,向數(shù)據(jù)集x中加入匹配的數(shù)據(jù)集y記
right_join(x,y,by = NULL) ? #右連接,向數(shù)據(jù)集y中加入匹配的數(shù)據(jù)集x記錄
full_join(x,y,by = NULL) #全連接,合并數(shù)據(jù)保留所有記錄,所有行
semi_join(x,y,by = NULL) #返回能夠與y表匹配的x表所有記錄
anti_join(x,y, by = NULL) ?#返回無法與y表匹配的x表的所有記錄
by設(shè)置兩個數(shù)據(jù)集用于匹配的字段名,默認使用全部同名字段進行匹配,如果兩個數(shù)據(jù)集需要匹配的字段名不同,可以直接用等號指定匹配的字段名,如, by = c("a" = "b"),表示用x.a和y.b進行匹配。
11)數(shù)據(jù)合并
dplyr包中也添加了類似cbind()函數(shù)和rbind()函數(shù)功能的函數(shù),它們是bind_cols()函數(shù)和bind_rows()函數(shù)。
注意:bind_rows()函數(shù)需要兩個合并對象有相同的列數(shù),而bind_cols()函數(shù)則需要兩個合并對象有相同的行數(shù)。
查看自帶的參考資料:vignette(package = "dplyr") vignette("introduction", package = "dplyr")