【问题标题】:What is the meaning of the "local data frame" message from `dplyr:::print.tbl_df`?来自`dplyr:::print.tbl_df`的“本地数据框”消息是什么意思?
【发布时间】:2015-05-19 00:19:06
【问题描述】:

当使用 dplyr 时,tbl_df 函数会打印一条语句,说明数据框是“本地”:

> mtcars %>%
+     group_by(gear) 
Source: local data frame [32 x 11]
Groups: gear

    mpg cyl  ...
1  21.0   6  ...

我认为本地数据框意味着内存中,而非本地数据框是 SQL 之类的数据库。不过,我认为我的假设是错误的。在大约 25:25 的 tutorial video 中,Kevin Markham 说 data.frame 对象不是本地数据帧,我相信它们是。

我查看了tbl_df 文档并在dplyr introduction vignette 中使用了搜索功能,但找不到本地数据框的描述。

问题: 什么是本地数据框?

【问题讨论】:

  • 只是将其与 MySQL 数据库之类的远程数据源区分开来。
  • 如果链接的视频是准确的,data_frame 对象是本地数据帧,但data.frame 对象不是。现在我也很困惑。
  • 我不认为@Tyler 最初的假设是错误的,并且有一些语义在起作用。也许,与 docs 和 Kevin Markham 的陈述一致,可以说“本地数据框”是由 tbl_df 从 data.frame 创建的数据包装,在包装之前它本身不是“本地数据框”?
  • 挖掘源代码后的一些见解:print.tbl_df 总是打印cat("Source: local data frame", ...),所以在这个意义上任何数据框都是本地 (link1); 本地数据框远程数据源link2)的“对立面”。
  • @smci 可以打开它,但我不打算实现它,因为我认为当前的行为对大多数人来说更有用

标签: r printing dplyr


【解决方案1】:

我是问题中提到的video tutorial 的作者。以下是与本次讨论相关的函数摘要:

  • data.frame() 是 R 用于创建常规数据帧的函数。
  • data_frame() 是 dplyr 用于创建本地数据帧的函数。
  • tbl_df()as_data_frame() 是 dplyr 的函数,用于将常规数据框(或列表)转换为本地数据框。

那么,常规本地数据帧有什么区别?很少。 local 数据框只是一个 常规 数据框,它使用 tbl_df 类进行包装以便更好地打印。 (数据仍然存储在“底层”的常规数据框中。)

具体来说,打印 local 数据框仅显示前 10 行,以及屏幕上可以容纳的尽可能多的列。 (您可以在我的first dplyr video tutorial 中的RMarkdown document 顶部看到此行为的示例,该示例位于上面链接的教程之前)。

所有 dplyr 函数默认返回 local 数据帧,但您可以使用 data.frame() 函数将其转换回 常规 数据帧。这样做的一个原因是,如果您更喜欢 常规 数据框的打印方式,即您希望看到更多行或更多列。但是,dplyr 允许您在不转换的情况下执行此操作:

library(dplyr)
library(nycflights13)

# print a local data frame (10 rows, variable number of columns)
flights

# print 15 rows
print(flights, n = 15)

# print all rows (don't run this, since it has 336,776 rows)
print(flights, n = Inf)

# print all columns
print(flights, width = Inf)

dplyr 有一个关于数据帧的vignette,它提供了更多技术细节。

【讨论】:

  • 我最初回答tbl_df()as_data_frame() 的用途略有不同。 @hadley 在Twitter 上澄清说它们“基本相同”,所以我更新了我的答案。
  • 普通data.frames 和tbl_dfs 之间除了打印方式之外还有另一个区别。引用文档:“[从不简化(丢弃),所以总是返回 data.frame”。这意味着data(mtcars); mtcars[, 1] 返回一个原子向量,tbl_df(mtcars)[,1] 返回一个(本地)data.frame 1 列。如果不加以注意,这种细微的差异可能会导致意外行为。因此,我建议在使用 tbl_dfs 时使用 [[ 提取单个列(这将始终提取单个向量)。
【解决方案2】:

http://www.inside-r.org/packages/cran/dplyr/docs/tbl_df

数据帧 tbl 包装了本地数据帧。在常规数据框上使用 tbl_df 的主要优点是打印:tbl 对象仅打印几行和适合一个屏幕的所有列,并将其余部分描述为文本。

来自

http://cran.r-project.org/web/packages/dplyr/dplyr.pdf

语言环境 请注意,对于本地数据帧,排序是在 C++ 代码中完成的,它无法访问通常在 R 中完成的本地特定排序。这意味着字符串的排序就像在 C 语言环境中一样

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2012-11-10
    • 2012-10-01
    • 2010-10-01
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多