【发布时间】:2019-01-15 21:28:14
【问题描述】:
创建小标题时,
tbl <- tibble(A=1:5, B=6:10)
结果
class(tbl)
是
[1] "tbl_df" "tbl" "data.frame"
我已经习惯了这种情况,因为我经常使用 dplyr。但是什么时候一个对象只是一个“tbl”(而不是一个“tbl_df”),反之亦然?如果有的话,我只想了解更多有关差异的信息。
任何文档将不胜感激!
【问题讨论】:
创建小标题时,
tbl <- tibble(A=1:5, B=6:10)
结果
class(tbl)
是
[1] "tbl_df" "tbl" "data.frame"
我已经习惯了这种情况,因为我经常使用 dplyr。但是什么时候一个对象只是一个“tbl”(而不是一个“tbl_df”),反之亦然?如果有的话,我只想了解更多有关差异的信息。
任何文档将不胜感激!
【问题讨论】:
您可以将“tibble”视为一个界面。如果一个对象可以响应所有 tibble 动作,那么您可以将其视为一个 tibble。 R 没有强类型。
所以tbl 是通用 tibble,tbl_df 是一种特定类型的 tibble,它基本上将其数据存储在 data.frame 中。
还有像 dtplyr 这样的其他软件包,它们允许您像 tibble 一样操作,但将您的数据存储在 data.table 中。例如
library(dtplyr)
ds <- tbl_dt(mtcars)
class(ds)
# [1] "tbl_dt" "tbl" "data.table" "data.frame"
还有dbplyr 包允许您使用SQL 数据库后端。例如
library(dplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, mtcars, "mtcars",temporary = FALSE)
cars_db <- tbl(con, "mtcars")
class(cars_db)
# [1] "tbl_dbi" "tbl_sql" "tbl_lazy" "tbl"
所以我们再次看到这个东西通常可以作为一个 tibble,但它还有其他类,因此它可以尝试在数据库引擎中完成所有工作,而不是在 R 本身中操作数据。
所以tbl 和tbl_df 之间并没有真正的“区别”。后者只是说明 tibble 是如何实际实现的,因此行为可能会有所不同(更优化)。
欲了解更多信息,您可以查看tibble vignette 或extending tibble vignette
【讨论】: