根據(jù)dplyr包的幫助文檔,來學習dplyr包
示例數(shù)據(jù)集:nycflights13包中的flights
函數(shù):
filter()
:根據(jù)變量對數(shù)據(jù)進行過濾篩選
arrange()
:對數(shù)據(jù)進行排序
select()
:根據(jù)變量選擇數(shù)據(jù)子集
mutate()
:增加新變量
summarise()
:匯總數(shù)據(jù)
sample_n()
和sample_frac()
:從數(shù)據(jù)集中隨機抽樣
一、數(shù)據(jù)的準備
1榆骚、安裝并加載nycflights13包掸哑,了解flights數(shù)據(jù)
install.packages("nycflights13")
library(nycflights13)
dim(flights)
head(flights)
? flights
可以看到flights是一個336776行贾虽,19列的tibble數(shù)據(jù).不理解數(shù)據(jù)里的變量名可以使用?flights
查看其幫助文檔
各個變量的含義如下:
year,month,day
: 航班出發(fā)日期
ep_time, arr_time
: 航班實際出發(fā)和到達的時間(格式:HHMM或者HMM)杆怕,當?shù)貢r間糠溜。
sched_dep_time,sched_arr_time
: 航班預定的本該出發(fā)和到達的時間笤虫。
dep_delay,arr_delay
: 出發(fā)和到達延誤時間
hour,minute
:預定出發(fā)時間分解為小時旁瘫,和分鐘的數(shù)據(jù)
carrier
:航空公司名稱縮寫
tailnum
:機尾編號
flight
:航班號
origin,dest
:出發(fā)和到達城市
air_time
:飛行時間,以分鐘為單位
distance
: 兩個機場之間的距離琼蚯,以英里為單位
time_hour
: 出發(fā)日期和出發(fā)時間的小時
二酬凳、使用dplyr函數(shù)對數(shù)據(jù)進行整理
1、使用filter()
對行進行篩選
install.packages("dplyr")
library(dplyr)
filter(flights, month == 1, day == 1)
## 基礎函數(shù)可以使用如下方式達到同樣效果:
flights[flights$month ==1 & flights$day == 1,]
2遭庶、使用arrange()
對行進行排序
arrange(flights, year, month, day)
# 配合使用desc()進行倒序排列:
arrange(flights, desc(year),desc(month),desc(day))
3宁仔、使用select()
選取列
select(flights, year, month, day)
select(flights, year:day)
select(flights,carrier:tailnum)
select(flights,10:12)
flights[,10:12]
# 配合starts_with(), ends_with(), matches(),contains()
select(flights, starts_with("dep"))
select(flights, ends_with("delay"))
select(flights, matches("arr"))
select(flights, contains("time"))
# 也可以使用select()對列進行重命名
select(flights, airlines = carrier)
# 因為select()去掉了所以其他沒有提到的列,所以更好用的重命名還是rename()
rename(flights, airlines = carrier)
4峦睡、使用mutate()
增加新的列
mutate(flights,
gain = arr_delay - dep_delay,
speed = distance / air_time*60
)
# mutate()和基礎函數(shù)transform()很相似翎苫,但是mutate()運行引用剛剛創(chuàng)建的新列:
mutate(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)
# 如果只想保留新變量权埠,使用transmute()
transmute(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)
5、使用summarise()
進行數(shù)據(jù)匯總
summarise(flights,
delay = mean(dep_delay, na.rm = TRUE)
)
# summarise()配合group_by()時會非常有用煎谍,后面進行講解
6攘蔽、使用sample_n()
和sample_frac()
進行隨機抽樣
sample_n(flights, 10) # 隨機抽取10行數(shù)據(jù)
sample_frac(flights, 0.01) # 隨機抽取1%的數(shù)據(jù)
7、使用group_by()
進行分組
by_tailnum <- group_by(flights, tailnum)
by_tailnum
delay <- summarise(by_tailnum,
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE))
delay
# n(), n_distinct(x), first(x), last(x), nth(x,n)
destinations <- group_by(flights, dest)
summarise(destinations,
planes = n_distinct(tailnum),
flights = n())
# 對分組數(shù)據(jù)進行向上逐步匯總:
daily <- group_by(flights, year, month,day)
per_day <- summarise(daily, flights = n())
per_day
per_month <- summarise(per_day, flights = sum(flights))
per_month
per_year <- summarise(per_month, flights = sum(flights))
per_year
8呐粘、使用管道符 %>%
簡化代碼書寫
目標:篩選出航班出發(fā)和到達延誤時間的平均值都超過30分鐘的日期
方法一:每一步都要保存一個變量满俗,缺點是每一步保存變量,下一步引用事哭,麻煩漫雷!
a1 <- group_by(flights, year, month, day)
a2 <- select(a1, arr_delay, dep_delay)
a3 <- summarise(a2,
arr = mean(arr_delay, na.rm = TRUE),
dep = mean(dep_delay, na.rm = TRUE))
a4 <- filter(a3, arr > 30 | dep > 30)
a4
方法二:從內向外嵌套函數(shù),缺點是參數(shù)離函數(shù)很遠鳍咱,不利于閱讀降盹。
filter(
summarise(
select(
group_by(flights, year, month, day),
arr_delay, dep_delay
),
arr = mean(arr_delay, na.rm = TRUE),
dep = mean(dep_delay, na.rm = TRUE)
),
arr > 30| dep > 30)
方法三:使用管道符,優(yōu)點是直接將上一步的結果作為下一步函數(shù)的輸入使用谤辜,規(guī)避了以上兩種方法的缺點蓄坏。
flights %>%
group_by(year, month, day) %>%
select(arr_delay, dep_delay) %>%
summarise(
arr = mean(arr_delay, na.rm = TRUE),
dep = mean(dep_delay, na.rm = TRUE)
) %>%
filter(arr > 30 | dep > 30)
三、總結
學了dplyr這個包的基本函數(shù)丑念,我可以對數(shù)據(jù)做什么了呢涡戳?
操作 | 函數(shù) |
---|---|
排序 | arrange() |
篩選 | filter()、select() |
增加列 | mutate() |
分組 | group_by() |
匯總 | summarise() |
抽樣 | sample_n()脯倚、sample_frac() |