數據準備
> library(hflights)
> library(dplyr)
> data("hflights",package = "hflights")
> hflights_df<-tbl_df(hflights)
$filter篩選
按給定的邏輯判斷篩選出符合要求的子數據集
除了代碼簡潔外, 還支持對同一對象的任意個條件組合, 如:
> filter(hflights_df,Month == 1,DayofMonth ==1)
> filter(hflights_df, Month == 1 | Month == 2)
> filter(tbl_hflights,Year == 2011, Month == 1, DepTime == 1400)
> filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400)
> filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime <= 1400)
> filter(tbl_hflights,Year == 2011 & Month == 1 & (DepTime == 1400 |? DepTime == 1430) & UniqueCarrier == 'AA')
$select選擇列
> b<-select(hflights_df,Year,Month,DayofMonth,FlightNum,Distance)
> c<-select(hflights_df,Year:ArrTime)
> w<-select(hflights_df,ArrTime:Year)
> v<-select(hflights_df,-Year,-Month,-DayofMonth,-FlightNum,-Distance)
> e<-select(hflights_df,-(Year:ArrTime))
$%>%管道函數
是最常用的一個操作符,就是把左側準備的數據或表達式,傳遞給右側的函數調用或 表達式進行運行,可以連續操作就像一個鏈條一樣。
# 設置隨機種子
> set.seed(1)
# 開始?
> n1<-rnorm(10000) ? ? ? ? ? ? # 第1步
> n2<-abs(n1)*50 ? ? ? ? ? ? ? ? ?# 第2步
> n3<-matrix(n2,ncol = 100)? # 第3步
> n4<-round(rowMeans(n3))? ? # 第4步
> hist(n4%%7) ? ? ? ? ? ? ? ? ? ? ? ? ? # 第5步# 設置隨機種子
> set.seed(1)
# 開始
> rnorm(10000) %>%
? ? +? abs %>% `*` (50) ?%>%
+? matrix(ncol=100)? %>%
+? rowMeans %>% round %>%?
+? `%%`(7) %>% hist
$arrange數據排序
arrange可以根據變量名依次對數據框進行排序,靠前的變量優先級越高,對變量名使用desc函數即為倒序。plyr(我們以后會介紹的一個包,同樣出品自Hadley Wickham)中也有一個相同的此函數。
hflights1<-select(filter(hflights_df,Year == 2011 & Month == 1 & DepTime == 1400),Year:ArrTime,AirTime)
arrange(hflights_df1,ArrTime)
arrange(hflights_df1,desc(AirTime),ArrTime)
$mutate變形
對已有列進行數據運算并添加為新列,值得稱贊的是,一段mutate的代碼中,靠后的變量操作可以操作前期新添加或改變的變量
c<-mutate(hflights_df,? gain = ArrDelay - DepDelay,? speed = Distance / AirTime * 60)
$summarise匯總
summarise是對數據框中的變量調用函數進行數據匯總,分組計算,使用分組計算的summarise能做的事情就多了非常多,其可以實現幾乎所有的類似于Excel中數據透視表的匯總功能。
summarise(hflights_df,? delay = mean(DepDelay, na.rm = TRUE))
> iris[1:4]%>%summarise_each(funs(mean,sum))??
Sepal.Length_mean Sepal.Width_mean Petal.Length_mean Petal.Width_mean Sepal.Length_sum1? ? ? ? ? 5.843333? ? ? ? 3.057333? ? ? ? ? ? 3.758? ? ? ? 1.199333? ? ? ? ? ? 876.5? Sepal.Width_sum Petal.Length_sum Petal.Width_sum1? ? ? ? ? 458.6? ? ? ? ? ? 563.7? ? ? ? ? 179.9
$ group_by()分組動作
此group_by的語法意義幾乎與SQL中的group by完全一樣,其也是針對被group by的變量進行分組的操作與計算,前提是有這樣的操作與計算。summarise配合使用分組計算能做到很大部分的數據透視表可以做的事情:
> w<-group_by(iris,Species)%>%
+? ? summarise(mean=mean(Sepal.Length),max=max(Sepal.Width),
+? ? ? ? ? ? ? min=min(Sepal.Width),sd=sd(Petal.Width))%>%
+? ? ungroup%>%
+? ? mutate(distTest = max-min)
$join合并
假設其形式均為join(x,y)
inner_join 返回所有在y中能查找到的x的行,且包含x和y的所有列;
left_join 返回所有x的行,且包含x和y的所有列,在y中沒有查找到的x的行新增的列的值會以NA填充;
right_join 同上,只是x和y調換了一下;
full_join 返回所有x和y的行和列,未查找的部分同樣會被NA填充;
anti_join 返回所有未能在y中能查找到的x的行,也只返回x的列
semi_join 返回所有在y中能查找到的x的行,也只返回x的列
$row wise $col wise 分別為按行和按列分組
其實就是apply(x,1,FUN)與,apply(x,2,FUN)但是比apply的效率高(不一定,親自測一下比較好)
> m=matrix(1:16000000,ncol=2)%>%data.frame
> system.time(m%>%rowwise%>%summarise(sum(X1,X2))) 用戶? 系統? 流逝 10.52? 0.00 10.52
?> system.time(m%>%apply(1,sum)) 用戶? 系統? 流逝 55.87? 0.10 55.97
$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對象有相同的行數。