‘data.frame’、‘tribble’和‘tibble’函数之间有什么区别?

问题描述 投票:0回答:1

data.frame
tribble
tibble
功能之间有什么区别?哪个更容易,哪个对于分析大量数据更有用?我正在创建一个数据框,但我不知道该选择哪一个。

r dataframe tidyverse tibble
1个回答
6
投票

数据框

数据框是一个表,其中每列可以有不同类型的值。其用途类似于电子表格或 SQL 表。举个例子可以让事情变得更清楚。

示例

例如,假设您有有关人员的数据:姓名、年龄以及他们是否受雇。我们可以将这些数据存储在向量中,例如:

names <- c('John', 'Sylvia', 'Arthemis') age <- c(32, 16, 21) employed <- c(TRUE, FALSE, TRUE)
数据框允许我们将与一个人相关的所有数据放在一行中。要创建它,我们只需将向量作为参数传递给 

data.frame()

:

> df <- data.frame(Name=names, Age=age, Working=employed) > df Name Age Working 1 John 32 TRUE 2 Sylvia 16 FALSE 3 Arthemis 21 TRUE
请注意数据格式现在变得更加清晰。有了数据框,许多操作变得更加容易。例如过滤:

> df[df$Age>20,] Name Age Working 1 John 32 TRUE 3 Arthemis 21 TRUE
这只是众多例子之一。使用数据框,过滤、聚合、绘图等变得更加简单。

蒂布尔斯

Tibbles 只是一种新型数据框架。它是非常流行的 tidyverse 软件包的一部分,在一些点上与数据框略有不同。

与数据框的差异

一个显着的区别是 tibble 格式包含更多信息:

> t <- tibble(Name=names, Age=age, Working=employed) > t # A tibble: 3 × 3 Name Age Working <chr> <dbl> <lgl> 1 John 32 TRUE 2 Sylvia 16 FALSE 3 Arthemis 21 TRUE
但更重要的是,tibbles 没有数据框所具有的一些令人困惑的特征。

例如,您可以通过仅给出列名称的开头来从数据框中获取列:

> df$N [1] "John" "Sylvia" "Arthemis"
它可能看起来很实用,但如果您在源代码中找到这一行,可能会很难理解。如果多个列以相同的前缀开头,也可能会导致错误。

如果您对 tibbles 执行此操作,它将返回

NULL

 并打印警告:

> t$N NULL Warning message: Unknown or uninitialised column: `N`.
这只是一个例子。 

在此页面上可以找到更多差异,尽管其中大多数与年长、更有经验的程序员更相关。

tribble()
功能

到目前为止,我们使用函数

tibble()

 创建了 tibble 对象。 
tribble()
 只是创建 tibble 对象的另一种方式。不同之处在于,虽然 
tibble()
 接收向量与 
data.frame()
 非常相似,但 
tribble()
 期望作为参数:

    所谓的“波形符语法”中的列名称;然后
  • 每一行
无需创建任何向量。

如何使用

tribble()

要理解它的含义以及它为何有用,可以通过一个示例来清楚地了解:

> t2 <- tribble( + ~Name, ~Age, ~`Employment status`, + "John", 32, TRUE, + "Sylvia", 16, FALSE, + "Arthemis", 21, TRUE + )
注意输入数据时可以看到表格格式。对于代码中的示例来说非常有用!但不要误会:返回对象相当于 

tibble()

:
创建的同一对象

> t2 # A tibble: 3 × 3 Name Age `Employment status` <chr> <dbl> <lgl> 1 John 32 TRUE 2 Sylvia 16 FALSE 3 Arthemis 21 TRUE
使用哪一个?

您可以使用任何您喜欢的东西!它们都工作得很好。然而,有些可能更适合一种或另一种情况。

    如果您不使用 tidyverse,您可能会使用传统数据框。
  • 现在,如果您使用 tidyverse,您可能更喜欢 tibbles,因为它们是这些包的基石。您可能还更喜欢 tibble 以避免混淆数据框行为。
假设您要创建 tibbles,您应该使用哪个函数?

    如果您从文件或向量中读取数据,您可能更喜欢使用
  • tibble()
  • 如果您要向 tibble 添加硬编码值,那么
  • tribble()
     函数可能更实用。
附录:混合

tibble()
tribble()
向上

虽然

tibble()

tribble()
 返回相同类型的对象,但它们具有非常不同的签名。然而,他们的名字确实很相似,所以人们经常把他们混淆。请注意这一点!

如果您调用

tibble()

 并传递 
tribble()
 参数,您将收到类似于以下内容的错误:

# ❌ WRONG! > tibble( + ~Name, ~Age, ~`Employment status`, + "John", 32, TRUE + ) Error: ! All columns in a tibble must be vectors. ✖ Column `~Name` is a `formula` object. Run `rlang::last_error()` to see where the error occurred.
如果您调用 

tribble()

 传递 
tibble()
 参数,这就是您将得到的错误:

# ❌ WRONG! > t <- tribble(Name=names, Age=age, Working=employed) Error: ! Must specify at least one column using the `~name` syntax. Run `rlang::last_error()` to see where the error occurred.
如果您遇到与这些类似的错误消息问题,请验证您在通话中使用了正确的签名。

(我发布这个附录是为了让人们在谷歌上搜索这些错误时可以找到这个问答。我花了一个小时试图理解为什么我会收到这个错误。这是一个令人惊讶的无法用谷歌搜索的主题!)

© www.soinside.com 2019 - 2024. All rights reserved.