【发布时间】:2014-09-27 00:42:28
【问题描述】:
比较下面data.table 和data.frame 的行为:
a.matrix <- matrix(seq_len(25),ncol = 5, nrow = 5)
a.list <- list(seq_len(5),a.matrix)
a.dt <- as.data.table(a.list)
a.df <- as.data.frame(a.list)
a.dt.df <- as.data.table(a.df)
str(a.dt)
str(a.df)
str(a.dt.df)
data.table将矩阵的列回收成适当长度的向量:
> str(a.dt)
Classes ‘data.table’ and 'data.frame': 25 obs. of 2 variables:
$ V1: int 1 2 3 4 5 1 2 3 4 5 ...
$ V2: int 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, ".internal.selfref")=<externalptr>
另一方面,data.frame 将每一列分开:
> str(a.df)
'data.frame': 5 obs. of 6 variables:
$ X1.5: int 1 2 3 4 5
$ X1 : int 1 2 3 4 5
$ X2 : int 6 7 8 9 10
$ X3 : int 11 12 13 14 15
$ X4 : int 16 17 18 19 20
$ X5 : int 21 22 23 24 25
我目前使用as.data.table 快速获得此行为的解决方法是通过as 强制器提供它:
> str(a.dt.df)
Classes ‘data.table’ and 'data.frame': 5 obs. of 6 variables:
$ X1.5: int 1 2 3 4 5
$ X1 : int 1 2 3 4 5
$ X2 : int 6 7 8 9 10
$ X3 : int 11 12 13 14 15
$ X4 : int 16 17 18 19 20
$ X5 : int 21 22 23 24 25
- attr(*, ".internal.selfref")=<externalptr>
为什么会有区别,有没有一种快速的方法来获得 data.frame 与 data.table 的行为?
【问题讨论】:
-
你可以比较
as.data.table(do.call(cbind, a.list))。 -
对
data.frame和data.table的强制转换非常不同。检查get("as.data.table.list",envir=environment(data.table))以查看列表如何被绑定到data.table并尝试例如as.data.table(list(seq_len(5),list(a.matrix)))并与as.data.frame进行比较。总而言之,基础as.data.frame似乎比as.data.table聪明得多,后者应该只用于data.frames。 -
嗯,不应该。为了一致性,它应该表现得像
as.data.frame(.)(除非有强烈的反对意见)。我猜这个用例以前从未真正发生过,所以我们有一个测试来捕捉它。你能在[这里](github.com/Rdatatable/data.table)提出问题吗?谢谢。 -
@arun,请看这里:stackoverflow.com/questions/26071883/…
标签: r matrix dataframe data.table