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)
如果您计划进行任何线性代数类型的操作,则矩阵是必需的.
如果经常按名称引用其列(通过紧凑的$运算符),则数据框更方便.
数据框也可以更好地用于报告(打印)表格信息,因为您可以单独将格式应用于每个列.
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.