R语言入门笔记5-数据整理dplyr包

根据dplyr包的帮助文档,来学习dplyr

  • 示例数据集nycflights13包中的flights

  • 函数
    filter():根据变量对数据进行过滤筛选
    arrange():对数据进行排序
    select():根据变量选择数据子集
    mutate():增加新变量
    summarise():汇总数据
    sample_n()sample_frac():从数据集中随机抽样

一、数据的准备

1、安装并加载nycflights13包,了解flights数据

install.packages("nycflights13")
library(nycflights13)
dim(flights)
head(flights)
? flights

可以看到flights是一个336776行,19列的tibble数据.不理解数据里的变量名可以使用?flights查看其帮助文档

各个变量的含义如下:

year,month,day: 航班出发日期
ep_time, arr_time: 航班实际出发和到达的时间(格式:HHMM或者HMM),当地时间。
sched_dep_time,sched_arr_time: 航班预定的本该出发和到达的时间。
dep_delay,arr_delay: 出发和到达延误时间
hour,minute:预定出发时间分解为小时,和分钟的数据
carrier:航空公司名称缩写
tailnum:机尾编号
flight:航班号
origin,dest:出发和到达城市
air_time:飞行时间,以分钟为单位
distance: 两个机场之间的距离,以英里为单位
time_hour: 出发日期和出发时间的小时

二、使用dplyr函数对数据进行整理

1、使用filter()对行进行筛选

install.packages("dplyr")
library(dplyr)
filter(flights, month == 1, day == 1)
## 基础函数可以使用如下方式达到同样效果:
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()和基础函数transform()很相似,但是mutate()运行引用刚刚创建的新列:
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()进行数据汇总

summarise(flights,
          delay = mean(dep_delay, na.rm = TRUE)
          )
# summarise()配合group_by()时会非常有用,后面进行讲解

6、使用sample_n()sample_frac()进行随机抽样

sample_n(flights, 10) # 随机抽取10行数据
sample_frac(flights, 0.01) # 随机抽取1%的数据

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())

# 对分组数据进行向上逐步汇总:
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、使用管道符 %>%简化代码书写

目标:筛选出航班出发和到达延误时间的平均值都超过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

方法二:从内向外嵌套函数,缺点是参数离函数很远,不利于阅读。

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)

方法三:使用管道符,优点是直接将上一步的结果作为下一步函数的输入使用,规避了以上两种方法的缺点。

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这个包的基本函数,我可以对数据做什么了呢?

操作 函数
排序 arrange()
筛选 filter()、select()
增加列 mutate()
分组 group_by()
汇总 summarise()
抽样 sample_n()、sample_frac()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352