我有一个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类?
答案 0 :(得分:4)
最初,我认为有必要使用data.table
将tbl
显式转换为"数据表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