data.frame
、tribble
和tibble
功能之间有什么区别?哪个更容易,哪个对于分析大量数据更有用?我正在创建一个数据框,但我不知道该选择哪一个。
数据框是一个表,其中每列可以有不同类型的值。其用途类似于电子表格或 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 软件包的一部分,在一些点上与数据框略有不同。
与数据框的差异
> 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
使用哪一个?
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.
如果您遇到与这些类似的错误消息问题,请验证您在通话中使用了正确的签名。
(我发布这个附录是为了让人们在谷歌上搜索这些错误时可以找到这个问答。我花了一个小时试图理解为什么我会收到这个错误。这是一个令人惊讶的无法用谷歌搜索的主题!)