我应该使用data.frame还是矩阵?

mic*_*obe 149 r matrix dataframe r-faq

应该何时使用a data.frame,何时使用matrix

两者都以矩形格式保存数据,因此有时候还不清楚.

有什么时候使用哪种数据类型有一般的经验法则吗?

Mic*_*hał 173

部分答案已包含在您的问题中:如果列(变量)可能具有不同类型(数字/字符/逻辑等),则使用数据框.矩阵用于相同类型的数据.

因此,如果您拥有相同类型的数据,则选择矩阵/ data.frame只会有问题.

答案取决于您将如何处理data.frame/matrix中的数据.如果它将被传递给其他函数,那么这些函数的预期类型的​​参数决定了选择.

也:

矩阵的内存效率更高:

m = matrix(1:4, 2, 2)
d = as.data.frame(m)
object.size(m)
# 216 bytes
object.size(d)
# 792 bytes
Run Code Online (Sandbox Code Playgroud)

如果您计划进行任何线性代数类型的操作,则矩阵是必需的.

如果经常按名称引用其列(通过紧凑的$运算符),则数据框更方便.

数据框也可以更好地用于报告(打印)表格信息,因为您可以单独将格式应用于每个列.

  • 我要补充的一点是,如果你计划使用ggplot2包来制作图形,ggplot2只适用于data.frames而不是矩阵.只是需要注意的事情! (4认同)

Rei*_*son 74

@Michal没有提到的一点是,不仅矩阵小于等效数据帧,使用矩阵可以使代码比使用数据帧更有效,通常是相当的.这就是为什么在内部,许多R函数将强制转换为数据帧中的矩阵数据的一个原因.

数据框通常更方便; 一个并不总是只有原子数据块.

请注意,您可以使用字符矩阵; 你不必只需要数字数据来构建R中的矩阵.

在将数据帧转换为矩阵时,请注意有一个data.matrix()函数,它通过将因子转换为基于内部级别的数值来适当地处理因子.as.matrix()如果任何因子标签是非数字的,则强制转换将导致字符矩阵.相比:

> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
     a   B  
[1,] "a" "A"
[2,] "b" "B"
[3,] "c" "C"
[4,] "d" "D"
[5,] "e" "E"
[6,] "f" "F"
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
     a B
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
Run Code Online (Sandbox Code Playgroud)

我几乎总是将数据框用于我的数据分析任务,因为我经常拥有的不仅仅是数字变量.当我为包编写函数时,我几乎总是强制使用矩阵,然后将结果格式化为数据帧.这是因为数据帧很方便.


pet*_*arp 47

@Michal:矩阵的内存效率并不高:

m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes
Run Code Online (Sandbox Code Playgroud)

...除非你有大量的列:

m <- matrix(1:400000, 2, 200000)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 22400568 bytes
Run Code Online (Sandbox Code Playgroud)


小智 9

矩阵实际上是一个带有其他方法的向量.而data.frame是一个列表.差异在于向量与列表.为了计算效率,坚持使用矩阵.如果必须,使用data.frame.

  • 嗯,矩阵是一个有维度的向量,我看不到方法的位置? (3认同)