Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当通过dplyr::filter进行管道传输时,如何保留data.table类?_R_Dplyr_Data.table_Dtplyr - Fatal编程技术网

当通过dplyr::filter进行管道传输时,如何保留data.table类?

当通过dplyr::filter进行管道传输时,如何保留data.table类?,r,dplyr,data.table,dtplyr,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.tab

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

最初,我认为有必要使用tbl_dt将data.table显式转换为数据表tbl,以保留类数据。table:

然而,正如Frank在评论中指出的,仅加载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爱好者能对此有所了解

.data参数和值在?filter and?select中是相同的,因此仅从这些信息很难看出为什么在这两个函数中对data.table类的.data进行了不同的处理

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

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

最初,我认为有必要使用tbl_dt将data.table显式转换为数据表tbl,以保留类data.table:

然而,正如Frank在评论中指出的,仅加载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爱好者能对此有所了解

.data参数和值在?filter and?select中是相同的,因此仅从这些信息很难看出为什么在这两个函数中对data.table类的.data进行了不同的处理

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

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

如果您使用的是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方法!,尽管如此,如果您确实希望在data.table上使用dplyr函数并保留class data.table,您可以使用dtplyr::tbl_dt创建数据表tbl。免责声明:我没有使用该功能,我只是注意到它的存在。我不知道在使用类tbl_dt tbl时,除了data.table data.frame之外,您是否会遇到麻烦。另外,请注意:dtplyr总是比data.table慢一点,因为它创建对象的副本,而不是在适当的位置进行变异,这是dplyr的原理。目前,dtplyr比bare data.table慢很多,因为这些方法不够智能。。因此,最好只使用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方法!,尽管如此,如果您确实希望在data.table上使用dplyr函数并保留class data.table,您可以使用dtplyr::tbl_dt创建数据表tbl。免责声明:我没有使用该功能,我只是注意到它的存在。我不知道在使用类tbl_dt tbl时,除了data.table data.frame之外,您是否会遇到麻烦。另外,请注意:dtplyr总是比data.table慢一点,因为它创建对象的副本,而不是在适当的位置进行变异,这是dplyr的原理。目前,dtplyr比bare data.table慢很多,因为这些方法不够智能。。因此,最好只使用data.table methods.Hi@Ashrith。只是好奇:我的回答解决了你的问题吗?嗨,Ashrith。只是好奇:我的回答解决了你的问题吗?