【发布时间】:2022-12-15 07:28:41
【问题描述】:
'data.frame'、'tribble' 和 'tibble' 函数之间有什么区别?哪个更容易,哪个对分析大量数据更有用?我正在创建一个数据框,但我不知道该选择哪个。谢谢!
【问题讨论】:
标签: r dataframe tidyverse tibble
'data.frame'、'tribble' 和 'tibble' 函数之间有什么区别?哪个更容易,哪个对分析大量数据更有用?我正在创建一个数据框,但我不知道该选择哪个。谢谢!
【问题讨论】:
标签: r dataframe tidyverse tibble
笔记:在这个答案中,我直接从 R 控制台复制了 sn-ps。 > 字符是行的开头不是命令的一部分,它们在那里只是为了表明该行是要键入的命令。
data frame 是一个表,其中每一列可以有不同类型的值。一个例子可以使事情更清楚。
例如,假设您有关于人的数据:姓名、年龄以及他们是否受雇。我们可以将这些数据放在向量中,例如:
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
这只是众多例子中的一个。使用数据框,过滤、聚合、绘图等事情变得更加简单。
从这个意义上说,数据框类似于电子表格或(对于更有经验的开发人员)SQL 表。
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`.
同样,这只是冰山一角:还有更多差异。你可以阅读他们on this page,尽管他们中的大多数与年长、更有经验的编码员更相关。
tribble() 函数到目前为止,我们使用函数 tibble() 创建了 tibble 对象。 tribble() 只是创建 tibble 对象的另一种方式。不同之处在于,虽然tibble() 接收向量与data.frame() 非常相似,但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
> t == t2
Name Age Working
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
您可以使用任何您喜欢的东西!他们都运作良好。
如果您不想安装 tidyverse,您可能会使用数据框。现在,如果您正在使用 tidyverse,您可能更喜欢 tibbles,因为它们是这些包的基石。您可能还更喜欢 tibble 以避免混淆数据框行为,或者如果您要将一些输入数据写入您的代码(在这种情况下您可能更喜欢使用 tribble())。
tibble()和tribble()
tibble() 和tribble() 返回相同类型的对象,但它们具有截然不同的签名。然而,他们的名字真的很相似,所以人们经常混淆他们。注意这一点!
如果你调用 tibble() 传递 tribble() 参数,你会得到类似这样的错误:
> t <- tibble(
+ "John", 32, TRUE,
+ "Sylvia", 16, FALSE,
+ "Arthemis", 21, TRUE
+ )
Error:
! Column name `TRUE` must not be duplicated.
Use .name_repair to specify repair.
Caused by error in `repaired_names()`:
! Names must be unique.
✖ These names are duplicated:
* "TRUE" at locations 3 and 9.
Run `rlang::last_error()` to see where the error occurred.
如果你调用 tribble() 传递 tibble() 参数,这是你将得到的错误:
> 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.
(我发布了这个附录,以便谷歌搜索这个错误的人可以找到这个问答。我花了一个小时试图理解 tibble 和 tribble 之间的区别,或者为什么我会收到那个错误,而且这是一个令人惊讶的无法谷歌话题!)
【讨论】: