8

我知道这table不是 频率表制作为data.table. 但是假设我有一个table,无论出于何种原因,我想转换为一个data.table. 转换的data.table工作方式与data.frame转换不同:

library(data.table)
tab <- table(1:101)
DF.tab <- data.frame(tab)
DT.tab <- data.table(tab)

data.frametable数据转换为data.frame, 同时data.table尝试将原始table对象存储为列。(除其他示例外,我已经使用tab <- table(1:n)的多个值对此进行了测试。)n

> str(DF.tab)
'data.frame':   101 obs. of  2 variables:
 $ Var1: Factor w/ 101 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Freq: int  1 1 1 1 1 1 1 1 1 1 ...
> str(DT.tab)
Classes ‘data.table’ and 'data.frame':  101 obs. of  1 variable:
 $ tab: 'table' int [1:101(1d)] 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr  "1" "2" "3" "4" ...
 - attr(*, ".internal.selfref")=<externalptr> 

另请注意,虽然与 ,as.data.frame的工作方式相同data.frame,但as.data.table完全失败:

> as.data.table(tab)
Error in UseMethod("as.data.table") : 
  no applicable method for 'as.data.table' applied to an object of class "table"

在似乎是一个非常密切相关的问题中,如果表足够大(非正式测试表明.Dim > 100),我在尝试时会遇到非常奇怪的错误print

> print(data.table(table(1:101)))
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  : 
  dims [product 5] do not match the length of object [10]

请注意,print(data.table(table(1:100)))没有错误,但只显示一列V1,而print(data.frame(table(1:100)))Var1Freq列。

有比 更好的解决方法data.table(data.frame(...))吗?我总是试图table完全避免更好吗?错误是print由这个直接引起的,还是更深层次的?

4

1 回答 1

6

有一个as.data.frame.table用 调用的函数data.frame(tbl-object)。它将类似矩阵的表格对象转换为长格式数据对象。似乎还没有 as.data.table.table 函数,可以说应该有,我同意它的行为方式应该与 as.data.frame 方法相同,而不是从矩阵继承(这就是 table 的方式通常继承:

> data.table(matrix(1:10, 2))
   V1 V2 V3 V4 V5
1:  1  3  5  7  9
2:  2  4  6  8 10
> data.table(as.table(matrix(1:10, 2)))
Error in UseMethod("as.data.table") : 
  no applicable method for 'as.data.table' applied to an object of class "table"
> data.table(as.data.frame(as.table(matrix(1:10, 2))))
    Var1 Var2 Freq
 1:    A    A    1
 2:    B    A    2
 3:    A    B    3
 4:    B    B    4
 5:    A    C    5
 6:    B    C    6
 7:    A    D    7
 8:    B    D    8
 9:    A    E    9
10:    B    E   10

我认为这应该是一个功能请求,我认为它与第二个问题无关。

您的第二个问题似乎是一个错误。最著名的data.table作者@MatthewDowle 通常反应迅速,您应该考虑提交报告。

于 2013-08-22T21:44:21.200 回答