【问题标题】:Why does data.table recycle matrices into a single vector when data.frame does not?为什么 data.table 将矩阵回收到单个向量中,而 data.frame 没有?
【发布时间】:2014-09-27 00:42:28
【问题描述】:

比较下面data.tabledata.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.framedata.table 的行为?

【问题讨论】:

  • 你可以比较as.data.table(do.call(cbind, a.list))
  • data.framedata.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)提出问题吗?谢谢。
  • 供参考,错误报告:github.com/Rdatatable/data.table/issues/833

标签: r matrix dataframe data.table


【解决方案1】:

只是为了在 SO 端关闭它,如 cmets 中所述,现在在 github 上将其作为 bug/issue 处理,添加到本文的 data.table 里程碑 v1.9.8。


跟进

现在已根据 commit 64f377... 解决此问题

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2014-07-06
    • 2019-04-01
    相关资源
    最近更新 更多