有群友问如果文件比较大,读入 R 比较慢怎么办?我告诉他用 data.table 包的 fread 读取。
其实,如果习惯了 tidyverse 系列工具,用 dtplyr 也是不错的,简单理解:dtplyr = dplyr + data.table
dtplyr 将 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()
最后需要指出的是,dtplyr 通常没有 data.table 快,如果追求极致速度,那么应该直接使用 data.table。
总的来说,dplyr 易用,但速度慢,data.table 速度快,但易用性差一些,而 dtplyr 在两者之间搭起一个桥梁,最终的趋势或许是两者合二为一。
[1] dtplyr官网: https://dtplyr.tidyverse.org/