在tidyverse中,类“ tbl”和“ tbl_df”的对象有什么区别?

时间:2018-08-08 14:49:28

标签: r dplyr tibble

创建小标题时,

a = np.empty(2, np.object)

class A(float):
    pass

a[0] = a[1] = A()
print(type(a[0]))  # <class '__main__.A'>
a[...] = A()
print(type(a[0]))  # <class 'float'>

的结果
tbl <- tibble(A=1:5, B=6:10)

class(tbl)

由于我经常使用dplyr,因此我经常看到这种情况。但是什么时候对象只是一个“ tbl”(而不是“ tbl_df”),反之亦然?我想进一步了解两者之间的区别(如果有)。

任何文档将不胜感激!

1 个答案:

答案 0 :(得分:7)

您可以将“ tibble”视为界面。如果对象可以响应所有微动动作,则可以将其视为微动。 R没有强类型。

因此tbl是通用小标题,而tbl_df是一种特定类型的小标题,基本上将其数据存储在data.frame中。

还有其他类似dtplyr的程序包,它们允许您像小玩意儿一样将数据存储在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"  

因此,我们再次看到,该事物通常可以充当小标题,但是它具有其他类,以便它可以尝试完成数据库引擎中的所有工作,而不是操纵R本身中的数据。 / p>

因此tbltbl_df之间并没有真正的“区别”。后者只是说明小标题的实际实现方式,因此行为可以有所不同(可以进行更优化)。

有关更多信息,您可以签出tibble vignetteextending tibble vignette