R数据科学整洁之道:使用dtplyr处理大文件

有群友问如果文件比较大,读入 R 比较慢怎么办?我告诉他用 data.table 包的 fread 读取。

其实,如果习惯了 tidyverse 系列工具,用 dtplyr 也是不错的,简单理解:dtplyr = dplyr + data.table

dtplyr 将 dplyr 作为前端,data.table 作为后端,这样做的好处是显而易见的:

  • 前端书写 dplyr 语法,简单、优雅
  • 后端自动转换为 data.table 代码,提升速度

安装

install.packages("dtplyr")

使用

要使用 dtplyr,需要加载下列三个包:

library(data.table)
library(dtplyr)
library(dplyr, warn.conflicts = FALSE)

然后使用lazy_dt()创建一个“lazy”数据表来追踪实现在其上的操作。

mtcars2 <- lazy_dt(mtcars)
mtcars2
## Source: local data table [32 x 11]
## Call:   `_DT1`
## 
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
## 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
## # … with 26 more rows
## 
## # Use as.data.table()/as.data.frame()/as_tibble() to access results

对于“lazy”数据表,dplyr 的各种动词都可以直接使用,比如 filter 函数:

mtcars2 %>%
  filter(wt < 5)
## Source: local data table [29 x 11]
## Call:   `_DT1`[wt < 5]
## 
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
## 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
## # … with 23 more rows
## 
## # Use as.data.table()/as.data.frame()/as_tibble() to access results

在打印出的结果中,可以看到这样一句话:Use as.data.table()/as.data.frame()/as_tibble() to access results。

这表示要访问最终结果,需要使用上述三个函数之一将结果转换成表格,如:

mtcars2 %>%
  filter(wt < 5) %>%
  as_tibble()
## # A tibble: 29 × 11
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
##  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
##  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
##  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
##  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
##  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
##  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
##  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
##  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
## 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
## # … with 19 more rows

总结

dtplyr 使用的一般格式为:

df %>%
  lazy_dt() %>%
  some dplyr verbe %>%
  as_tibble()
  • 首先,用 lazy_dt() 将数据框转换成“lazy”数据框
  • 其次,使用各种 dplyr 动词对数据进行操作
  • 最后,用函数将结果转换成数据框

最后需要指出的是,dtplyr 通常没有 data.table 快,如果追求极致速度,那么应该直接使用 data.table。

总的来说,dplyr 易用,但速度慢,data.table 速度快,但易用性差一些,而 dtplyr 在两者之间搭起一个桥梁,最终的趋势或许是两者合二为一。

参考

[1] dtplyr官网: https://dtplyr.tidyverse.org/

粉丝福利

学生信,计算机基础一定要好。毫不夸张地说,计算机基础决定了你能否入门,而生物学修养决定你能走多远。没有出发,如何走得远?


原文始发于微信公众号(简说基因):R数据科学整洁之道:使用dtplyr处理大文件

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/42798.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!