【问题标题】:How to retain data.table class when piped through dplyr::filter?通过 dplyr::filter 传输时如何保留 data.table 类?
【发布时间】: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 dtplyr notes:“dtplyr 总是会比 data.table 慢一点,因为它创建对象的副本而不是就地变异(这是 dplyr 的理念)。目前, dtplyr 比裸 data.table 慢很多,因为这些方法不够聪明。”。因此,最好坚持使用data.table 方法。

标签: r dplyr data.table dtplyr


【解决方案1】:

本来我认为有必要将data.table显式转换为“数据表tbl”,使用tbl_dt,保留类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"

但是,正如 Frank 在 cmets 中指出的那样,仅加载 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 issue,所以希望一些dtplyr 爱好者可以对此有所了解。


.data 参数和 ?filter?select 中是相同的,因此仅从这些信息很难看出为什么 data.table 类的 .data 会被区别对待在这两个函数中。


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

mtcars_dt[ , .(hp, mpg)][hp > 100]
# or
mtcars_dt[j = .(hp, mpg)][i = hp > 100]

【讨论】:

  • 嗨@Ashrith。只是好奇:我的回答解决了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2019-05-23
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多