1

我有一个 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"

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

4

1 回答 1

4

最初,我认为有必要使用 , 显式转换data.table为“数据表tbltbl_dt以保留 class 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就足够了:

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问题,所以希望一些dtplyr爱好者可以对此有所了解。


和 中的.data参数和是相同的?filter?select因此仅从这些信息中很难说出为什么在两个函数中.data对类的处理方式不同。data.table


在这个小小的练习之后,我仍然认为你应该坚持data.table语法。特别是,您可以链接操作:

mtcars_dt[ , .(hp, mpg)][hp > 100]
# or
mtcars_dt[j = .(hp, mpg)][i = hp > 100]
于 2018-03-19T16:09:21.590 回答