前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R数据科学整洁之道:使用dtplyr处理大文件

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

作者头像
简说基因
发布2022-11-11 16:19:19
5220
发布2022-11-11 16:19:19
举报
文章被收录于专栏:简说基因简说基因

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

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

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

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

安装

代码语言:javascript
复制
install.packages("dtplyr")

使用

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

代码语言:javascript
复制
library(data.table)
library(dtplyr)
library(dplyr, warn.conflicts = FALSE)

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

代码语言:javascript
复制
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 函数:

代码语言:javascript
复制
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。

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

代码语言:javascript
复制
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 使用的一般格式为:

代码语言:javascript
复制
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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简说基因 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 使用
  • 总结
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档