搜索
查看: 917|回复: 2

[R] R数据科学啃书

[复制链接]

14

主题

26

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2018-9-7 22:00:14 | 显示全部楼层 |阅读模式
第三章 使用dplyr进行数据转换
dplyr专注于接受data.frame格式文件
本文主要是通过nycflights13数据集(包括2013年从纽约市出发的航班信息)教会你如何进行数据转换 ###准备工作

library(tidyverse)
library(nycflights13)
library(ggplot2)
nycflights13数据包
nycflights13::flights
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      517            515         2      830
##  2  2013     1     1      533            529         4      850
##  3  2013     1     1      542            540         2      923
##  4  2013     1     1      544            545        -1     1004
##  
View(nycflights13::flights)
这个数据框包含了2013年从纽约市出发的所有336 776次航班信息。该数据来源于美国交通统计局。数据格式为data frame。

首先明确变量类型

1、int表示整数型变量 2、dbl表示双精度浮点数型变量,或称实数(带负数) 3、chr表示字符向量。或称字符串 4、dttm表示日期时间(日期+时间)型变量 5、lgl表示逻辑型变量,是一个仅包括T和F的向量 6、fctr表示因子,R用其来表示具有固定数目值得分类变量 7、data表示日期型变量

其次明白flights数据集的变量意义,可以使用?flights来查看说明 year,month,day 表示出发日期 dep_time,arr_time 表示实际出发和到达时间 sched_dep_time,sched_arr_time 表示计划出发和到达日期 dep_delay,arr_delay 表示出发和到达延误,以分钟为单位。 负时间表示提前离开/到达 hour,minute 表示预定出发时间分为小时和分钟。 carrier 表示两字符缩写的航空公司名称 tailnum 表示飞机编号 flight 表示飞行次数 origin,dest 表示出发地和目的地 air_time 表示空中花费的时间,以分钟为单位 distance 表示两个机场的距离 time_hour 表示作为POSIXct日期的航班的预定日期和小时(可以使用?POSIXct查询帮助及格式)
dplyr基础
filter函数
缺失值
尝试理解下列代码

NA>5
## [1] NA
NA==10
## [1] NA
NA+10
## [1] NA
NA/2
## [1] NA
test_e <- group_by (flights,year,month,day)
summarize(test_e,mean=mean(dep_delay))
## # A tibble: 365 x 4
## # Groups:   year, month [?]
##     year month   day  mean
##    <int> <int> <int> <dbl>
##  1  2013     1     1    NA
##  2  2013     1     2    NA
##  3  2013     1     3    NA
##  4  2013     1     4    NA
##  5  2013     1     5    NA

mean函数计算了dep_delay的平均数,不幸的是dep_delay中含有缺失值NA,这导致返回结果均含有NA。 ###比较运算符号

1>2
## [1] FALSE
1<2
## [1] TRUE
1<=2
## [1] TRUE
2>=1
## [1] TRUE
1!=1
## [1] FALSE
1==1
## [1] TRUE
逻辑运算符号
y <- c(1,2,3,4)
x <- c(2,3,4,5)
y&!x
## [1] FALSE FALSE FALSE FALSE
x
## [1] 2 3 4 5
x|y
## [1] TRUE TRUE TRUE TRUE
x&y
## [1] TRUE TRUE TRUE TRUE
xor(x,y)
## [1] FALSE FALSE FALSE FALSE
x&!y
## [1] FALSE FALSE FALSE FALSE
y
## [1] 1 2 3 4
明白了上述三个重要点,下面来学习filter函数 Use filter() find rows/cases where conditions are true. Unlike base subsetting with [, rows where the condition evaluates to NA are dropped

filter(flights,year==2013,month==1,day==15)
## # A tibble: 894 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1    15      453            500        -7      645
##  2  2013     1    15      518            525        -7      825
##  3  2013     1    15      533            530         3      839
##  4  2013     1    15      534            540        -6      829
##  5  2013     1    15      535            540        -5     1014
##  6  2013     1    15      543            600       -17      710
##  7  2013     1    15      549            600       -11      637
##  8  2013     1    15      552            600        -8      934
##  9  2013     1    15      552            600        -8      658
## 10  2013     1    15      553            600        -7      851
## # ... with 884 more rows, and 12 more variables: sched_arr_time <int>,
## #   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
## #   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## #   minute <dbl>, time_hour <dttm>
filter(flights,year==2013,month==1,day==15,dep_delay==-1)
## # A tibble: 51 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1    15      559            600        -1      804
##  2  2013     1    15      629            630        -1      907
##  3  2013     1    15      629            630        -1      925
##  4  2013     1    15      659            700        -1     1027

filter(flights,year==2013,month==1,day==15,dep_delay==NA)
## # A tibble: 0 x 19
## # ... with 19 variables: year <int>, month <int>, day <int>,
## #   dep_time <int>, sched_dep_time <int>, dep_delay <dbl>, arr_time <int>,
## #   sched_arr_time <int>, arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
(dec <- filter(flights,year==2013,month==1,day==15,dep_delay==-1))
## # A tibble: 51 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1    15      559            600        -1      804
##  2  2013     1    15      629            630        -1      907
##  3  2013     1    15      629            630        -1      925
##  4  2013     1    15      659            700        -1     1027

3.2练习题
1、找出满足以下条件的所有航班 a. 到达时间延误2小时或更多的航班 题目条件: 1、到达时间延误2小时 2、或 3、更多

filter(flights,arr_delay==120 | arr_delay> 120) #or
## # A tibble: 10,200 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      811            630       101     1047
##  2  2013     1     1      848           1835       853     1001
##  3  2013     1     1      957            733       144     1056
##  4  2013     1     1     1114            900       134     1447

filter(flights,arr_delay>=120)
## # A tibble: 10,200 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      811            630       101     1047
##  2  2013     1     1      848           1835       853     1001
##  3  2013     1     1      957            733       144     1056
##  4  2013     1     1     1114            900       134     1447

b.飞往休斯顿(IAH机场或HOU机场)的航班 题目条件: 1、目的地IAH机场 2、或 3、目的地HOU机场

(a=group_by(flights,tailnum))
## # A tibble: 336,776 x 19
## # Groups:   tailnum [4,044]
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      517            515         2      830
##  2  2013     1     1      533            529         4      850
##  3  2013     1     1      542            540         2      923
##  4  2013     1     1      544            545        -1     1004

(b=select(a,tailnum,dest,everything()))
## # A tibble: 336,776 x 19
## # Groups:   tailnum [4,044]
##    tailnum dest   year month   day dep_time sched_dep_time dep_delay
##    <chr>   <chr> <int> <int> <int>    <int>          <int>     <dbl>
##  1 N14228  IAH    2013     1     1      517            515         2
##  2 N24211  IAH    2013     1     1      533            529         4
##  3 N619AA  MIA    2013     1     1      542            540         2
##  4 N804JB  BQN    2013     1     1      544            545        -1

(c=filter(b,dest== "IAH" | dest== "HOU"))
## # A tibble: 9,313 x 19
## # Groups:   tailnum [1,321]
##    tailnum dest   year month   day dep_time sched_dep_time dep_delay
##    <chr>   <chr> <int> <int> <int>    <int>          <int>     <dbl>
##  1 N14228  IAH    2013     1     1      517            515         2
##  2 N24211  IAH    2013     1     1      533            529         4
##  3 N459UA  IAH    2013     1     1      623            627        -4
##  4 N488UA  IAH    2013     1     1      728            732        -4

summarize(c,n())
## # A tibble: 1,321 x 2
##    tailnum `n()`
##    <chr>   <int>
##  1 N11206     11
##  2 N12109      9
##  3 N12114     11
##  4 N12116      7
##  5 N12125      9
##  6 N12216     16
##  7 N12218      9
##  8 N12221     13
##  9 N12225     14
## 10 N12238     18
## # ... with 1,311 more rows
flights %>% group_by(tailnum) %>% select(tailnum,dest,everything())%>% filter(dest== "IAH" | dest== "HOU") %>% summarize(n())
## # A tibble: 1,321 x 2
##    tailnum `n()`
##    <chr>   <int>
##  1 N11206     11
##  2 N12109      9
##  3 N12114     11
##  4 N12116      7
##  5 N12125      9
##  6 N12216     16
##  7 N12218      9
##  8 N12221     13
##  9 N12225     14
## 10 N12238     18
## # ... with 1,311 more rows
c、延误至少1小时,但飞行过程中弥补回来30分钟的航班。 题目条件: 1、飞行延误大于60分钟 2、预计延误1小时到达,但提前半小时到达。

filter(flights,dep_delay>60 & dep_delay - arr_delay > 30)
## # A tibble: 1,819 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1     2205           1720       285       46
##  2  2013     1     1     2326           2130       116      131
##  3  2013     1     3     1503           1221       162     1803
##  4  2013     1     3     1839           1700        99     2056

d、出发时间在午夜和早上6点之间的航班

filter(flights, dep_time <= 600 | dep_time == 2400)
## # A tibble: 9,373 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      517            515         2      830
##  2  2013     1     1      533            529         4      850
##  3  2013     1     1      542            540         2      923
##  4  2013     1     1      544            545        -1     1004

特别说明一下dep_time时间表示为6点等于600,24点等于2400,23点10分表示为2310. 2、dep_time有缺失值的航班是多少?其他变量的缺失值情况如何?

count(filter(flights,is.na(dep_time)))
## # A tibble: 1 x 1
##       n
##   <int>
## 1  8255
使用arrange()函数排列行
a=select(flights,year,month,day,everything())

arrange(a,year,month,day)
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      517            515         2      830
##  2  2013     1     1      533            529         4      850
##  3  2013     1     1      542            540         2      923
##  4  2013     1     1      544            545        -1     1004

arrange(a,year,month,desc(day))
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1    31        1           2100       181      124
##  2  2013     1    31        4           2359         5      455
##  3  2013     1    31        7           2359         8      453
##  4  2013     1    31       12           2250        82      132

练习题3.3
1、如何使用arrange()将缺失值排到前面?

arrange(flights, desc(is.na(dep_time)), dep_time)
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1       NA           1630        NA       NA
##  2  2013     1     1       NA           1935        NA       NA
##  3  2013     1     1       NA           1500        NA       NA
##  4  2013     1     1       NA            600        NA       NA
2、对flighs排序找出延误时间最长的航班和出发时间最早的航班

arrange(flights, desc(dep_delay))
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     9      641            900      1301     1242
##  2  2013     6    15     1432           1935      1137     1607
##  3  2013     1    10     1121           1635      1126     1239
##  4  2013     9    20     1139           1845      1014     1457
##  5  2013     7    22      845           1600      1005     1044

3、对flights排序找出速度最快的航

arrange(flights, air_time) %>%select(origin, dest, air_time) %>%head()
## # A tibble: 6 x 3
##   origin dest  air_time
##   <chr>  <chr>    <dbl>
## 1 EWR    BDL         20
## 2 EWR    BDL         20
## 3 EWR    BDL         21
## 4 EWR    PHL         21
## 5 EWR    BDL         21
## 6 EWR    PHL         21




上一篇:0907 R数据科学啃书 --p21 第3.5题等看下别人的回答
下一篇:使用dplyr进行数据转换
回复

使用道具 举报

365

主题

512

帖子

1713

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1713
发表于 2018-9-9 22:04:52 | 显示全部楼层
你这个排版很有趣,不需要代码块也可以看:http://www.biotrainee.com/thread-16-1-1.html
回复 支持 反对

使用道具 举报

14

主题

26

帖子

141

积分

注册会员

Rank: 2

积分
141
 楼主| 发表于 2018-9-9 23:28:24 | 显示全部楼层
ydchen 发表于 2018-9-9 22:04
你这个排版很有趣,不需要代码块也可以看:http://www.biotrainee.com/thread-16-1-1.html  ...

非常感谢您提供的信息 下回我会尝试的 非常感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-8-23 11:25 , Processed in 0.038208 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.