美文网首页
翻译练习:chapter 5 ~《R for Data Scie

翻译练习:chapter 5 ~《R for Data Scie

作者: 阿伦影子 | 来源:发表于2017-08-11 14:41 被阅读0次

    先贴一段第四章的话:

    You now have some experience running R code. I didn’t give you many details, but you’ve obviously figured out the basics, or you would’ve thrown this book away in frustration! Frustration is natural when you start programming in R, because it is such a stickler for punctuation, and even one character out of place will cause it to complain. But while you should expect to be a little frustrated, take comfort in that it’s both typical and temporary: it happens to everyone, and the only way to get over it is to keep trying.

    你现在对于运行一段R的代码有了一定的经验。我并没有给你太多的细节,但是你可能已经清楚地理解了基本内容,或者你已经失望地把这本书扔掉了。失望对于刚开始用R编程的你来说太正常了,因为它对于标点符号太执着了,即使一个不合适的字符也会让它报错。但是当你感到有一点失望时,你也可以在以下这种典型而又暂时的情况中找到安慰:每个人都会遇到这样的情况,而唯一打败它的方法就是不断地尝试和练习。

    第五章正式开始:

    5.1 引言

    可视化对于产生洞察是很重要的工具,但是恰好满足格式要求的数据却并不是很多。你可能会经常需要创造一些新的变量或者摘要,或者你只是想要你只是想要对变量重命名,或者对观测重新排序,以便使数据更容易处理。你会在这章中完全学到该怎么做(甚至更多),包括如何使用dplyr包转换你的数据,还有一个新的数据集——2013年飞离纽约市的航班统计。

    5.1.1 预备知识

    这章中我们着重讲解如何使用dplyr包,它是另一个tidyverse中的核心成员。我们将会通过运用nycflight13包中的数据来展示这些核心思想,并用ggplot2来帮助我们理解数据。

    library(nycflights13)library(tidyverse)

    当你加载tidyverse时,要小心冲突信息的提示。它会告诉你dplyr包覆盖了基础R中的一些函数。如果你需要在加载了dplyr包后使用这些基本版的函数,你需要使用它们的全名: stats::filter() 和 stats::lag()。

    5.1.2 ncyflights13

    为了探索dplyr包中的基本数据处理动词,我们会用到nycflights13::flights。这个数据框包含了2013年从纽约离港的336,776架次航班。数据来源是美国交通统计局,并且记录在 ?flights中。

    flights#>#Atibble:336,776×19#>yearmonthdaydep_timesched_dep_timedep_delayarr_time#>#>12013115175152830#>22013115335294850#>32013115425402923#>4201311544545-11004#>5201311554600-6812#>6201311554558-4740#>#...with3.368e+05morerows,and12morevariables:#>#sched_arr_time,arr_delay,carrier,flight,#>#tailnum,origin,dest,air_time,#>#distance,hour,minute,time_hour

    你可能注意到了这个和你之前用到过的其它数据框有一点不同:它仅仅在单个屏幕中显示前面的几行和所有的列。(要想看整个数据集,你可以运行View(flights),他会在Rstudio观测器中打开该数据集)。它显示方式不同是因为它是属于tibble类型。Tibble也是数据框,但是做了些轻微的调整使其在tidyverse中变现更为出色。现在,让我们抛开那些不同,我们会在wrangle中详细讨论。

    你会注意到第三行(或第四行)中在列名下的字母缩写。它们描述了不同变量的类型:

    · int 表示整数。

    · dbl表示双精度型或实数。

    ·chr表示字符型向量或字符串。

    ·dttm表示日期时间。

    还有三种常见的变量类型,虽然这里没有用到但你会在这本书后面的内容中遇到:

    · lgl 表示逻辑型向量,只包括TRUE和FALSE。

    · fctr 表示因子,R用来表示含有固定的可能值的分类变量。

    · date 表示日期。

    5.1.3 dplyr基础

    本章你会学到五个dplyr包中的关键函数,这会让你解决数据处理中的大部分挑战:

    根据值来挑选观测(filter())。

    按行重新排序(arrange())。

    根据名字来挑选变量(select())。

    根据已知变量创建新的变量(mutate())。

    把众多的值整合到单个总结当中(summarise())。

    以上这些函数可以和group_by()结合使用,该函数改变上述各个函数的作用范围,使得数据处理从对整个数据集的处理到分组处理。这六个函数就提供了数据处理语言所需的动词函数。

    所有的动词函数原理类似:

    1 第一个自变量是一个数据框。

    2 后续的自变量描述对于这个数据框做什么处理,这里会用到变量名(无引用)。

    3 输出结果是个新的数据框。

    总之,这些属性使得把多个简单步骤连接起来获得复杂的结果这件事变得很简单。让我们接下来深入了解一下这些动词函数如何使用。

    5.2 用filter()来过滤行

    filter() 让你可以根据观测的值来取子集。第一个自变量是数据框的名称。第二个以及后续的自变量是过滤数据框的描述语句。比如,我们可以选择一月一号的所有航班,代码及结果如下:

    filter(flights, month == 1, day == 1)#> # A tibble: 842 × 19#>    year month  day dep_time sched_dep_time dep_delay arr_time#>                        #> 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#> 5  2013    1    1      554            600        -6      812#> 6  2013    1    1      554            558        -4      740#> # ... with 836 more rows, and 12 more variables: sched_arr_time ,#> #  arr_delay , carrier , flight , tailnum ,#> #  origin , dest , air_time , distance , hour ,#> #  minute , time_hour

    当你运行这段代码,dplyr执行了相应的过滤粗滤并返回一个新的数据框。dplyr中的函数不会修改输入值,所以若你想要保存结果,你需要用到赋值运算符 <-:

    jan1 <- filter(flights, month == 1, day == 1)

    R既不会打印出结果,也不会把它们存储一个变量。若要实现这两个功能,你可以在赋值语句两边加上括号:

    (dec25 <- filter(flights, month == 12, day == 25))#> # A tibble: 719 × 19#>    year month  day dep_time sched_dep_time dep_delay arr_time#>                        #> 1  2013    12    25      456            500        -4      649#> 2  2013    12    25      524            515        9      805#> 3  2013    12    25      542            540        2      832#> 4  2013    12    25      546            550        -4    1022#> 5  2013    12    25      556            600        -4      730#> 6  2013    12    25      557            600        -3      743#> # ... with 713 more rows, and 12 more variables: sched_arr_time ,#> #  arr_delay , carrier , flight , tailnum ,#> #  origin , dest , air_time , distance , hour ,#> #  minute , time_hour

    5.2.1 比较

    为了有效地使用过滤函数,你必须知道如何通过比较操作来选择观测变量。R提供了标准的套装:>, >=, <, <=, != (不等于), and ==(等于)。

    当你使用R的时候,最容易犯的错误就是在测试等式时,用=代替了==。不信你看下面就是报错提示:

    filter(flights, month = 1)#> Error: filter() takes unnamed arguments. Do you need `==`?

    在使用==时,你还会遇到另一个常见的问题:浮点数。这些结果会吓到你!

    sqrt(2) ^ 2 == 2#> [1] FALSE1/49 * 49 == 1#> [1] FALSE

    计算机使用的是有限精度算法(它们显然无法存储一个无限的数字!)所以你要记住每一个你看到的数字都是估计。你可以用near()代替==:

    near(sqrt(2) ^ 2,  2)#> [1] TRUE near(1 / 49 * 49, 1)#> [1] TRUE

    5.2.2 逻辑型

    filter()中的多个变量用“and”来结合:即每个语句都为真的情况下,对应的那一行才能包括在输出中。对于其他类型的组合,你会用到布尔运算符:&是“与”,| 是“或”,! 是“非”。图5.1现实了完整的布尔运算符集合。

    图5.1 布尔运算符集。x是左侧的圆环,y是右侧的圆环,阴影部分为经过相应的运算后所得出的结果。

    下面的代码可以找到在11月或12月离港的所有航班:

    filter(flights, month == 11 | month == 12)

    这种处理的顺序并不像英语那样。你不能写filter(flights, month == 11 | 12),这只是“找到11月或12月离港的所有航班”的字面翻译。它反而会寻找所有等于11 | 12的月份,而这时一个为TRUE的表达式。在数字环境下(就像这里),TRUE变成了一,因此它就会寻找一月份中的所有航班,而不是11月或12月。这真是容易混淆啊!

    解决这个问题的一个有用的速记是%in% 。它选择对应于y中等于x的值的所有行。我们可以将上面的代码重写:

    nov_dec <- filter(flights, month %in% c(11, 12))

    有时候你可以采用摩根定律来简化复杂的子集处理:!(x & y)和!x | !y一样,!(x | y)和!x & !y也是相同的。例如,若你想要找出延误时间(到达或者起飞)不超过两小时的航班,你可以采取下面两者中的任意一个:

    filter(flights, !(arr_delay > 120 | dep_delay > 120))filter(flights, arr_delay <= 120, dep_delay <= 120)

    R中不仅有&和|,还有&&和||。这里就别用它们啦!在conditional execution中你会学到的。

    无论何时,当你在中filter()开始使用复杂的、多个部分的表达式时,最好用明确的变量来代替它们。这样做可以更方便地检查。马上你就会学到如何创建新的变量了。

    5.2.3 缺失值

    R中一个很重要的特性使得比较变得难以处理,他就是缺失值,或者NA(“不可用值”)。NA表示未知的值,因此缺失值就变得“有传染性”:几乎所有的包含未知值的操作都会变成未知。

    NA > 5#> [1] NA10 == NA#> [1] NANA + 10#> [1] NANA / 2#> [1] NA

    最蛋疼的下面这个:

    NA == NA#> [1] NA

    加点文本你理解起来就容易多了:

    # Let x be Mary's age. We don't know how old she is.x <- NA# Let y be John's age. We don't know how old he is.y <- NA# Are John and Mary the same age?x == y#> [1] NA# We don't know!

    你可以用is.na()来判断某个值是否缺失:

    is.na(x)#> [1] TRUE

    filter()只会过滤出判断为TRUE的行;它包含FALSE和NA两种值。如果你想要保护缺失值,你可以清楚地要求,如:

    df <- tibble(x = c(1, NA, 3))filter(df, x > 1)#> # A tibble: 1 × 1#>      x#>  #> 1    3filter(df, is.na(x) | x > 1)#> # A tibble: 2 × 1#>      x#>  #> 1    NA#> 2    3

    5.2.4 练习

    1 找到以下航班:

    到达时间延误两小时以上的

    飞到休斯顿的(IAH or HOU)

    由United, American, or Delta操控的

    在夏天起飞的(July, August, and September)

    晚到两小时,但是离开时没有迟到的

    延误至少半小时,但是在飞行过程中节约了半小时以上的

    在00:00到06:00(含)之间起飞的

    答:

    library(nycflights13)library(dplyr)#练习1.1filter(flights, arr_delay >= 120)#练习1.2filter(flights, dest == "IAH" | dest == "HOU")#练习1.3filter(flights, carrier %in% c("UA","AA","DL"))#练习1.4filter(flights, month %in% c(8,9,10))#练习1.5 filter(flights, arr_delay>=120 & dep_delay<=0)#练习1.6 dec <- filter(flights, dep_delay >= 60 & (arr_delay-dep_delay <= -30))#练习1.7 deo <- filter(flights, dep_time >= 000 & dep_time <= 600)

    2 dplyr中另一个有用的过滤函数是between()。它是干嘛的?你可以用它来简化之前问题的答案吗?

    答:

    between(x, left, right)#This is a shortcut for x >= left & x <= right, implemented efficiently in C++ for local values, and translated to the appropriate SQL for remote tables.#练习2,简化练习1.7 des <- filter(flights, between(dep_time ,000, 600))

    3 有多少航班缺失了dep_time?还有别的什么变量缺失了?这些行代表了什么?

    答:

    #练习3dek <- filter(flights, is.na(dep_time))#这些行可能表示航班取消了

    4 NA ^ 0为什么不是缺失值?NA | TRUE为什么不是缺失值?FALSE & NA为什么不是缺失值?你能够总结出一般规律吗?(NA * 0是个有迷惑性的反例)

    答:NA ^ 0结果为1;与True进行或运算,不管是什么,结果肯定为真;与False进行与运算,不管是什么,结果肯定为假。一般规律,我也也说不清,先记住吧。NA * 0=NA。

    其余章节见原文。

    相关文章

      网友评论

          本文标题:翻译练习:chapter 5 ~《R for Data Scie

          本文链接:https://www.haomeiwen.com/subject/jeolrxtx.html