R数据表:如何从tibble转换为data.table再转换为tibble?

8

我主要使用tidyverse中的tibble格式来制作表格,但有些步骤我会使用data.table包。我想知道将data.table转换回tibble的最佳方法是什么?

我知道data.table有一些聪明的函数setDTsetDF 函数,它们通过引用(即不复制)将data.frame转换为data.table(反之亦然)。

但如果我想将其转换回tibble该怎么办?我是否应该在setDT()生成的data.frame上使用as_tibble来复制数据?是否有聪明的方法可以利用data.table中的setattr()来完成这项工作?

library(data.table)
library(tidyverse)

iris_tib <- as_tibble(iris)

## some data.table operation
setDT(iris_tib)
setkey(iris_tib, Species)
iris_tib[, Sepal.Length.Mean := mean(Sepal.Length), by = Species]



## How to convert back to tibble efficiently?
setDF(iris_tib)
iris_tib_back <-  as_tibble(iris_tib)

## it looks like we were able to update by reference? Only rownames were (shallow) copied?
changes(iris_tib, iris_tib_back)

4
你的“一些data.table操作”在tidyverse中非常简单,对吧?如果你更喜欢dplyr的语法,Hadley 提供了一个保留dplyr语法的data.table接口:https://github.com/hadley/dtplyr 关于你的主要问题,也许这个回答能解决它?(我没有测试过)https://github.com/Rdatatable/data.table/issues/1877#issuecomment-253864899 - Frank
1
两个很好的参考,谢谢!第一个很有趣,第二个...我认为基本上就是我正在寻找的答案了! :-) - Matifou
2
好的,很酷 :) 你可以自己回答它(我不会回答,因为我没有安装tibble并且不知道如何确认setattr技巧是否达到了预期的结果) - Frank
1
问题在于我自己不太清楚如何确定结果是否正确,哈哈,也不确定as_tibble()函数对行名称的处理方式。但我想,如果我不太关心行名,那应该没问题。 - Matifou
1个回答

6

正如@Frank所说,这个问题在这里的帖子中已经讨论过。一种可能的解决方法是使用setattr()函数,该函数通过引用设置属性。确切地说:

setattr(x, "class", c("tbl", "tbl_df", "data.frame"))

如果原始类有疑问:

old_class <- class(iris_tib)
setDT(iris_tib)
.... # bunch of data.table operatios
setDF(iris_tib)
setattr(iris_tib, "class", old_class)

这个操作似乎能够成功将数据转换为tibble格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接