如何在通过dplyr :: filter传输时保留data.table类?

时间:2018-03-19 11:09:25

标签: r dplyr data.table dtplyr

我有一个data.table对象,我通过几个dplyr函数进行管道 通过dplyr::select时,结果对象的类是data.table + data.frame 但是当我通过dplyr::filter传递它时,输出类只是data.frame。

mtcars_dt = data.table(mtcars)         # "data.table" "data.frame"

mtcars_dt %>% dplyr::select(hp, mpg) %>% class # "data.table" "data.frame"
mtcars_dt %>% dplyr::filter(hp > 100) %>% class # "data.frame"

为什么会发生这种情况?如何确保在使用dplyr::filter时保留data.table类?

1 个答案:

答案 0 :(得分:4)

最初,我认为有必要使用data.tabletbl显式转换为"数据表tbl_dt",以保留类{{ 1}}:

data.table

然而,正如弗兰克在评论中所指出的,仅仅加载library(data.table) library(dtplyr) library(magrittr) mtcars_dt %>% tbl_dt() %>% dplyr::select(hp, mpg) %>% class # [1] "tbl_dt" "tbl" "data.table" "data.frame" mtcars_dt %>% tbl_dt() %>% dplyr::filter(hp > 100) %>% class # [1] "tbl_dt" "tbl" "data.table" "data.frame" 就足够了:

dtplyr

怪异。要么?我发布了一个dtplyr issue,所以希望一些mtcars_dt %>% dplyr::select(hp, mpg) %>% class # [1] "data.table" "data.frame" mtcars_dt %>% dplyr::filter(hp > 100) %>% class # [1] "data.table" "data.frame" 爱好者可以对此有所了解。

dtplyr参数和.data?filter中是相同的,因此从这些信息来看,很难说明原因{类?select的{​​1}}在两个函数中的处理方式不同。

在这个小小的异常之后,我仍然认为你应该坚持使用.data语法。特别是,您可以进行连锁操作:

data.table