数据框(data.frame)、tibble和矩阵(matrix)有什么区别?

15

在 R 中,一些函数只能在 data.frame 上工作,而另一些函数只能在 tibblematrix 上工作。

使用 as.data.frameas.matrix 转换数据通常可以解决这个问题,但我想知道这三种数据结构的区别是什么?


3
矩阵和数据框执行不同的功能。数据框可以同时包含不同的数据类型,如字符、数字、因子和时间。而矩阵只能包含单一类型。因此,矩阵在功能上更加有限,但由于保证是单一类型,可以作为连续数组存储在内存中,从而实现更高效的计算。R没有tibble - 这是一个外部包的附加功能,并继承自数据框,因此两者通常是相互兼容的。 - Allan Cameron
3
非常感谢您的澄清。我没有意见,只是不知道其中的区别。如果有一种通用类型能够服务于所有用途,某人可能已经想到了。我认为每种不同类型肯定有其优缺点。我只是因为无知而提问,但如果您认为这种无知就是意见,那么可以关闭问题。 - Sylvia Rodriguez
1
矩阵用于线性代数,回归等方面,而数据框用于表示数据集,如关系数据库表。Tibble 不是 R 的一部分,但是它是 tidyverse 的一部分,“Tibbles 是对数据框的现代化解决方案。它们保留了经得起时间考验的功能,并放弃了过去方便但现在令人沮丧的功能(例如将字符向量转换为因子)。”请参阅https://cran.r-project.org/web/packages/tibble/vignettes/tibble.html。 - G. Grothendieck
1
@G.Grothendieck 关于 data.frametibble:唯一的区别是“将字符向量转换为因子”吗?我认为,R已经改变了默认的 stringasfactors 行为?另请参见 https://developer.r-project.org/Blog/public/2020/02/16/stringsasfactors/index.html - Christoph
2个回答

19
因为它们有不同的用途。
简短概述:
- 数据框是等长向量列表。这意味着添加列就像将向量添加到列表一样容易。它还意味着虽然每列都有自己的数据类型,但列可以是不同类型的。这使得数据框对于数据存储非常有用。 - 矩阵是具有两个维度的原子向量的特殊情况。这意味着整个矩阵必须具有单一的数据类型,这使它们在代数运算中非常有用。在某些情况下,它还可以使数字操作更快,因为您不必执行类型检查。但是,如果您对数据框足够小心,它将没有太大区别。 - Tibble 是 tidyverse 中使用的数据框的现代化版本。它们使用多种技术使它们“更智能” - 例如延迟加载。
矩阵、数据框和其他数据结构在 R 中的详细描述
因此,总结一下:矩阵和数据框都是二维数据结构。每个都有不同的用途,因此行为不同。Tibble 是试图现代化数据框的尝试,它被广泛应用于 Tidyverse 中。
如果我试图从非技术角度重新表述它:
每种数据结构都在进行权衡。
- 数据框为方便和清晰度而牺牲了一些效率。 - 矩阵是高效的,但更难处理,因为它对其数据施加了限制。 - Tibble 为了更方便而牺牲了更多的效率,同时还试图用技术掩盖所说的权衡,以尝试将计算推迟到不出现问题的时间。

1
哇,这是一个非常棒的解释。谢谢你。我以前已经使用过所有三种类型,但我从未确切地知道它们之间的区别。这是一个优秀的详细描述。谢谢! - Sylvia Rodriguez
1
tibbles 的解释是错误的。没有计算被延迟,我不确定这里的懒加载是什么意思。也许是与从“tbl_df”和“tbl_lazy”继承的特殊类型的 tibbles 混淆了,这种类型的 tibbles 是专门用于与数据库一起使用的。 - moodymudskipper

1
关于数据框架和tibbles之间的区别,这里解释了两个主要的区别:https://www.rstudio.com/blog/tibble-1-0-0/
此外,我的理解如下: -如果您对tibbles进行子集操作,您总是会得到一个tibble。 -Tibbles可以具有复杂条目。 -Tibbles可以被分组。 -Tibbles显示更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接