第一部分探索--第3章 使用dplyr进行数据转换

3.1 简介

dplyr: 创建新变量或者摘要统计量,或者对变量重命名或排序。

3.1.1 准备工作

加载dplyr和数据包
加载dplyrh和nycflight13数据包

3.1.2 nycflight13

2013年从纽约市出发的航班信息336 776次航班
?flights查看其说明文档

flights

  • int:整数型变量 integers
  • dbl:实数 doubles or real numbers
  • chr:字符向量/字符串 character vectors or strings
  • dttm:日期+时间型变量 a date+a time
  • lgl:逻辑型变量,仅包括TRUE 和FALSE logical
  • fctr:因子,固定数目的值的分类变量 factor
  • date:日期型变量 dates

3.1.3 dplyr基础

5个核心函数+group_by()

  • 按值筛选观测:(filter())
  • 对行进行重新排序 (arrange())
  • 按名称选取变量 (select())
  • 使用现有变量创建新变量 (mutate())
  • 多个值总结为一个摘要统计量 (summarize())
    工作方式:
    (1)第一个参数是一个数据框
    (2)随后参数使用变量名称(不带引号)描述了在数据框进行的操作
    (3)输出结果是一个新数据框

3.2 使用filter()筛选行

基础知识

举例:筛选出1月1日的所有航班

  • 输出结果


    筛选出1月1日的所有航班
  • 筛选后保存--要赋值操作
    > jan1 <- filter(flights, month==1,day==1)
  • 输出结果同时保存变量

3.2.1 比较运算符

比较运算符:>, >=, <, <=, !=(不等于), ==(等于)
near() 近似值用于浮点数

什么是浮点数

浮点数就是小数点可以任意浮动的数字。

在计算机的机器语言中,只有二进制,机器语言只能识别0和1。所以,计算机也是不可能存储小数的,所以需要有另一种变通的存储方案。这种方案就是指数方案:

3.2.2 逻辑运算符

  • & :与
  • | :或
  • !:非
    布尔运算符

    举例:
    找出11月或12月出发的所有航班 > filter(flights,month==11|month==12)
    找出延误时间(到达或出发)不多于2小时的航班 > filter(flights,!(arr_delay>120|dep_delay>120)); > filter(flights,arr_delay<=120, dep_delay<=120)
    !(x&y) = !x|!y 不等于x和y=既不等于x或不等于y
    !(x|y) = !x&!y 不等于x或y=不等于x和不等于y

3.2.3 缺失值

  • NA =缺失值=not available,不可用。
  • 缺失值“可传染的”,如果运算中包含了未知值,那么运算结果一般也是未知值。


  • 如果想要确定一个值是否为缺失值,可以使用is.na()函数:is.na(x)
  • filter()只能筛选出条件为TRUE的行;它会排除那些条件为FALSE和NA的行。
  • 若想保留缺失值,可以明确指出is.na(x)

3.3 使用arrange()排列行

  • 接受一个数据框和一组作为排序依据的列名作为参数。若列名不止一个,那么使用后面的列在前面排序的基础上继续排序。
    > arrange(flights, year,month,day)
  • 使用desc()按列降序排序 > arrange(flights, desc(arr_delay))
  • 缺失值总是排在最后

3.4 使用select()选择列

  • 按名称选择列
  • 选择"year"和"day"之间的所有列(包括year 和day)
  • 选择不在"year"和"day"之间的所有列(不包括year和day)
  • 辅助函数:
    starts_with("abc"): matches names that begin with “abc”.
    ends_with("xyz"): matches names that end with “xyz”.
    contains("ijk"): matches names that contain “ijk”.
    matches("(.)\\1"): selects variables that match a regular expression. This one matches any variables that contain repeated characters. You’ll learn more about regular expressions in strings.
    num_range("x", 1:3): matches x1, x2 and x3
  • rename()来重命名变量 rename(flights, tali_num=tailnum)
  • select()函数和everything()辅助函数结果使用:将几个变量移到数据框开头select(flights, time_hour, air_time, everything())

3.5 使用mutate()添加新变量

基础知识

  • mutate()函数:新列添加在数据集的最后
> flights_sml <- select(flights, year:day, ends_with("delay"),distance,air_time)
> mutate(flights_sml, gain=arr_delay-dep_delay, speed=distance/air_time*60)
  • transmute()函数:只想保留新变量
    > transmute(flights, gain=arr_delay-dep_delay,hours=air_time/60,gain_per_hour=gain/hours)

3.5.1 常用创建函数

  • 算数运算符 Arithmetic operators:+, -, *, /, ^
  • 模运算符 Modular arithmetic:%/% (整数除法 integer division) and %% (求余
    remainder), where x == y * (x %/% y) + (x %% y)
  • 对数函数:log(), log2(), log10()
  • 偏移函数:lead(), lag()
  • 累加和滚动聚合:cumsum(), cumprod(), commim(), cummax(), cummean()
  • 逻辑比较:<, <=, >, >=, 和!=
  • 排秩:min_rank(), row_number(), dense_rank(), percent_rank(), cume_dist()

3.6 使用summarize()进行分组摘要

summarize: 将数据框折叠成一行。



summarize()+group_by()

举例:对按日期分组的一个数据框应用summarize,就可以得到每日平均延误时间

3.6.1 使用管道组合多种操作

研究每个目的地的距离和平均延误时间之间的关系。

  • 完成数据准备分3步:
    (1)按照目的地对航班进行分组:by_dest <- group_by(flights, dest)
    (2)进行摘要统计,计算距离,平均延误时间和航班数量:delay <- summarize(by_dest,count=n(), dist=mean(distance, na.rm=TRUE),delay=mean(arr_delay, na.rm = TRUE))
    (3)筛选去除噪声点和火奴鲁鲁加长: delay <- filter(delay, count>20, dest!="HNL")
  • 作图
    ggplot(data = delay, mapping = aes(x=dist, y=delay))+
    geom_point(aes(size=count),alpha=1/3)+
    geom_smooth(se=FALSE)
> by_dest <- group_by(flights, dest)
> delay <- summarize(by_dest,count=n(), dist=mean(distance, na.rm=TRUE),delay=mean(arr_delay, na.rm = TRUE))
> delay <- filter(delay, count>20, dest!="HNL")
> ggplot(data = delay, mapping = aes(x=dist, y=delay))+
+ geom_point(aes(size=count),alpha=1/3)+
+ geom_smooth(se=FALSE)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'


na.rm=remove NA

另一种方法是使用管道“%>%。%>%=然后”

> delays <- flights %>%
+ group_by(dest)%>%
+ summarize(count=n(),dist=mean(distance, na.rm=TRUE),delay=mean(arr_delay, na.rm = TRUE))%>%
+ filter(count>20,dest!="HNL")

3.6.2 缺失值

na.rm参数就是在计算前除去缺失值
示列



缺失值表示取消的航班,可以先去除取消的航班来解决缺失值问题。


3.6.3 计数

一个计数(n())或非缺失值的计数(sum(!is.na())
举例:查看具有最长平均延误时间的飞机(通过机尾编号进行识别)

> delays <- not_cancelled%>%
+ group_by(tailnum) %>% 
+ summarize(delay=mean(arr_delay))
> ggplot(data=delays, mapping = aes(x=delay))+
+ geom_freqpoly(binwidth=10)

航班数量和平均延误时间的散点图

+ group_by(tailnum) %>%
+ summarise(delay=mean(arr_delay, na.rm = TRUE),n=n())
> ggplot(data = delays, mapping = aes(x=n,y=delay))+
+ geom_point(alpha=1/10)
+ filter(n>25) %>% 
+ ggplot(mapping = aes(x=n,y=delay))+
+ geom_point(alpha=1/10)

3.6.4 常用的摘要函数

  • 位置度量
  • 分散程度度量
    sd(x)均方误差(标准误差), IQR(x)四分位距, mad(x)绝对中位差
  • 秩的度量
    min(x), quantile(x,0.25)(找出x中按从小到大顺序大于前25%而小于后75%的值), max(x)
  • 定位度量
    first(x), nth(x,2), last(x)
  • 计数n()
    计算出非缺失值的数量:sum(!is.na(x))
    计算出唯一值的数量:distinct(x)
  • 逻辑值的计数和比例:sum(x>10)和mean(y==0)

3.6.5 按多个变量分组: group_by()

循序渐进地进行摘要分析:

3.6.6 取消分组:ungroup()

3.6.7 练习

3.7 分组新变量(和筛选器)

  • 找出每个分组中最差的成员
  • 找出大于某个阈值的所有分组
  • 对数据进行标准化以计算分组指标


总结

这章学下来感觉还是有点难度,要懂点数据统计知识,逻辑性要好, 对数据把握好才能进行对的命令运行。

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

推荐阅读更多精彩内容