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/

粉丝福利

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值