有群友问如果文件比较大,读入 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