【发布时间】:2018-08-27 22:16:46
【问题描述】:
我有一个 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 类?
【问题讨论】:
-
如果您使用的是data.table,为什么不能使用data.table方法,即
mtcars_dt[hp>100]或在管道中mtcars_dt %>% .[hp>100] -
@akrun 的建议不是“管道”吗?他只是使用
data.table语法而不是dplyr函数。 -
您也可以与 data.table 链接:
mtcars_dt[, .(hp, mpg)][hp > 100] -
首先,我完全同意 @akrun 和 Jaap 的观点(使用
data.table方法!),不过,如果你绝对想在 @ 上使用dplyr函数987654333@ 并保留类data.table,您可以使用dtplyr::tbl_dt来“创建数据表Tbl”。免责声明:我没有使用该功能,我只是注意到它存在。除了"data.table" "data.frame"之外,我不知道您是否会在某个时候遇到class"tbl_dt" "tbl"的麻烦。 -
另外,请注意the
dtplyrnotes:“dtplyr 总是会比 data.table 慢一点,因为它创建对象的副本而不是就地变异(这是 dplyr 的理念)。目前, dtplyr 比裸 data.table 慢很多,因为这些方法不够聪明。”。因此,最好坚持使用data.table方法。
标签: r dplyr data.table dtplyr