原文dplyr 0.7.0 | RStudio Blog
我非常荣幸的宣布,dplyr 0.7.0版本在CRAN上线了!(之前的版本是0.6.0,下文将详细说明。)dplyr提供了一种操作数据的“语法”,让用户可以更轻松、更优雅地解决一些最常见的数据挑战。它支持多种后端:内存中的数据框,以及远程SQL数据库。如果你之前未曾听说过dplyr,你最好从数据科学之R中的数据变形章节开始入手。
你可以通过如下方式安装最新版的dplyr
Install.packages (“dplyr”)
特征
正如发布通告所说,dplyr 0.7.0 修复和改进了超过100个的错误。在本篇博文中,我想要谈论一个重大的改变和一些小的更新。这一版的dplyr见证了数据框链接的一个主要的革新,对于这一重磅消息,我将在下一周的博文中单独说明。
简洁评估
简洁评估实现了一种新的编程系统,这是dplyr中一项最重大的改变。这一系统可以捕捉代码中表达式的值并将其传入后文中合适位置。这使得你可以在使用dplyr时自由修改和使用这些值:
my_var <- quo(homeworld)
starwars %>%
group_by(!!my_var) %>%
summarise_at(vars(height:mass), mean, na.rm = TRUE)
#> # A tibble: 49 x 3
#> homeworld height mass
#>
#> 1 Alderaan 176.3333 64.0
#> 2 Aleen Minor 79.0000 15.0
#> 3 Bespin 175.0000 79.0
#> 4 Bestine IV 180.0000 110.0
#> 5 Cato Neimoidia 191.0000 90.0
#> 6 Cerea 198.0000 82.0
#> 7 Champala 196.0000 NaN
#> 8 Chandrila 150.0000 NaN
#> 9 Concord Dawn 183.0000 79.0
#> 10 Corellia 175.0000 78.5
#> # ... with 39 more rows
这使得你可以写出像dplyr中一样的函数,省去了很多复制-粘贴操作:
starwars_mean <- function(my_var) {
my_var <- enquo(my_var)
starwars %>%
group_by(!!my_var) %>%
summarise_at(vars(height:mass), mean, na.rm = TRUE)
}
starwars_mean(homeworld)
你可以使用代词.data
在字符串中指代变量:
my_var <- "homeworld"
starwars %>%
group_by(.data[[my_var]]) %>%
summarise_at(vars(height:mass), mean, na.rm = TRUE)
这在你编写自己的包时非常有用,因为它避免了许多烦人的注释。
想了解更多简洁评估的作用,以及它是如何解决了数据分析中的难题,请阅读用dplyr编程。rlang包实现了简洁评估功能,它同时提供了学科理论基础的概述。简洁评估拥有复杂的功能,学起来会有一些难度,但是我们确信,学会它是非常值得的,尤其是在tidyverse的其他的包中,它也充当了非常重要的角色(很快将在tidyr和ggplot2上实现)。
简洁评估的发布意味着标准评估版本的每一个主要操作不再是必须的,同时我们鼓励用户弃用这些函数(虽然这些函数不会直接禁止)。
字符编码
我们做了很多工作,以保证在windows上dplyr不仅仅支持Latin1编码。如果你工作的数据数据库包含中文,日语,韩语等字符时尤其重要。当前版本的dplyr应当能应付这些编码,如果你在使用这些编码时遇到问题,请及时联系我们。
新数据集
dplyr包含了一些新的数据集,你可以测试更多有趣的例子:
• starwars
如上所示,包含了星球大战的一些信息,数据来源Star Wars API,包含少许列表字段。
starwars
#> # A tibble: 87 x 13
#> name height mass hair_color skin_color eye_color
#>
#> 1 Luke Skywalker 172 77 blond fair blue
#> 2 C-3PO 167 75 gold yellow
#> 3 R2-D2 96 32 white, blue red
#> 4 Darth Vader 202 136 none white yellow
#> 5 Leia Organa 150 49 brown light brown
#> 6 Owen Lars 178 120 brown, grey light blue
#> 7 Beru Whitesun lars 165 75 brown light blue
#> 8 R5-D4 97 32 white, red red
#> 9 Biggs Darklighter 183 84 black light brown
#> 10 Obi-Wan Kenobi 182 77 auburn, white fair blue-gray
#> # ... with 77 more rows, and 7 more variables: birth_year ,
#> # gender , homeworld , species , films ,
#> # vehicles , starships
• storms
含有200组热带风暴的轨迹线,其中包含了强大的分组结构。
storms
#> # A tibble: 10,010 x 13
#> name year month day hour lat long status category
#>
#> 1 Amy 1975 6 27 0 27.5 -79.0 tropical depression -1
#> 2 Amy 1975 6 27 6 28.5 -79.0 tropical depression -1
#> 3 Amy 1975 6 27 12 29.5 -79.0 tropical depression -1
#> 4 Amy 1975 6 27 18 30.5 -79.0 tropical depression -1
#> 5 Amy 1975 6 28 0 31.5 -78.8 tropical depression -1
#> 6 Amy 1975 6 28 6 32.4 -78.7 tropical depression -1
#> 7 Amy 1975 6 28 12 33.3 -78.0 tropical depression -1
#> 8 Amy 1975 6 28 18 34.0 -77.0 tropical depression -1
#> 9 Amy 1975 6 29 0 34.4 -75.8 tropical storm 0
#> 10 Amy 1975 6 29 6 34.0 -74.8 tropical storm 0
#> # ... with 10,000 more rows, and 4 more variables: wind ,
#> # pressure , ts_diameter , hu_diameter
• Band_members
, band_instruments
以及 band_instruments2
是一个乐队相关的小型数据集。简单的设计是你可以专心展示joins 的工作方式,而不会被数据细节所干扰。
band_members
#> # A tibble: 3 x 2
#> name band
#>
#> 1 Mick Stones
#> 2 John Beatles
#> 3 Paul Beatles
band_instruments
#> # A tibble: 3 x 2
#> name plays
#>
#> 1 John guitar
#> 2 Paul bass
#> 3 Keith guitar
新增描述统计词
• Pull()
函数以字段名或者索引的方式,帮你简便地抽取一个单独字段。这点很想select(),不同的是pull函数返回一个向量,小巧无比。
mtcars %>% pull(-1) %>% str()
#> num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
mtcars %>% pull(cyl) %>% str()
#> num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
感谢Paul Poncet的主意!
• Arrange() 如果你想将一个数据框分组,arrange函数可以帮你实现,通过添加一个.by_group参数,使你可以任意分组(默认FALSE)。
• 给单表格变量加上后缀可以规定他们的范围,比如_if(),_at(),_all()。使用全部的变量用_all(),按名字选的用_at(),符合某种条件的用_if().
iris %>% summarise_if(is.numeric, mean)
starwars %>% select_if(Negate(is.list))
storms %>% group_by_at(vars(month:hour))
其他重要改变
• 本地的join
函数可以控制缺失值的匹配方式。默认值时na_matches = “na”
,意味着系统将认为所有的缺失值相等,na_matches = “never”
将会避免这种匹配。
配置pkgconfig::set_config(“dplyr::na_match”,”never”)
可以改变默认值。
• Bind_rows()
和combine()
函数在执行时要求更加严格。逻辑变量不会强制转换为数值或者整型。日期、POSIX二进制等数据类型也不会转换,以避免在转换过程中遗失元数据。我们在今后还会加强这些接口。
改变来自破坏
我时常发现,我会在旧版的dplyr中犯一些错误,而这些错误,正成了我改进它的动机。如果问题过于严重,我会试着从头再来。因为修改一些小的bug往往不能解决问题。往往,我发现推到重做往往会带来更大的改变,虽然这需要一定的决心,承受一定的痛苦。
不管怎样,dplyr的更新仍然会打断你的代码,这无疑使人感到沮丧。我计划做两件事来最小化这种伤害。
• 采取一种奇偶发布版本形式,API断层只发生在偶数版本上,保证奇数版本只包含修改bug和新的功能,这就是为什么我跳过了0.6.0版本直接跳到0.7.0上。
• 花费时间来开发一些工具,能够分离包和项目,这样当你在做一些有关联的项目时,能够有选择的升级包,如果出现包导致的错误,可以及时退回到没有错误的包中去。请在一年之内的新闻中留意信息。
鸣谢
Dplyr包确确实实是合作的成果。一部分来自于dplyr团队(Kirill Müller, Lionel Henry以及我本人)。另外还有Christophe Dervieux, Dean Attali, Ian Cook, Ian Lyttle, Jake Russ, Jay Hesselberth, Jennifer (Jenny) Bryan, @lindbrook, Mauro Lepore, Nicolas Coutin, Daniel, Tony Fischetti, Hiroaki Yutani and Sergio Oller.如果没有他们的帮助,这一版也不会发布。
感谢你们的贡献!