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) #隨機有重復(fù)的取50行數(shù)
sample_frac(mtcars, 0.1, weight = 1 / mpg) #隨機無重復(fù)的以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) ?#返回?zé)o法與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")