1

我有一个相当基本data.table的 R 语言,有 250k 行和 90 列。我正在尝试data.table在其中一个属于 class 的列上键入character。当我打电话时:

setkey(my.dt,my.column)

我收到以下神秘的错误消息:

"Error in setkeyv(x, cols, verbose=verbose) :
reorder received irregular lengthed list"

我找到了带有此消息的源代码提交,但无法完全破译它的含义。我的键列不包含 NA 或空白值,看起来非常合理(它包含股票代码),并且在默认order()命令下表现良好。

更令人沮丧的是,以下代码正确完成:

first.dt <- my.dt[1:100000]
setkey(first.dt,my.column)
second.dt <- my.dt[100001:nrow(my.dt]
setkey(second.dt,my.column)

我不知道这里会发生什么。有小费吗?

编辑 1:我已经确认键中的每个值都符合相当标准的格式:

> length(grep("[A-Z]{3,4}\\.[A-Z]{2}",my.dt$my.column)) == nrow(my.dt)
[1] TRUE

编辑 2:我的系统信息如下(请注意,我实际上使用的是 Windows 7)。我正在使用 data.table 1.8 版。

> Sys.info()
          sysname           release           version          nodename           machine             login 
        "Windows" "Server 2008 x64"      "build 7600" "WIN-9RH28AH0CKG"          "x86-64"   "Administrator" 
             user    effective_user 
  "Administrator"   "Administrator" 
4

1 回答 1

1

请运行:

sapply(my.dt, length)

我怀疑一个或多个列与第一列的长度不同,这是无效的data.table. 它不会是前 5 个之一,因为您的.Internal(inspect(my.dt))(谢谢)显示了这些并且它们没问题。

如果是这样,在 v1.8.1 中有这个错误修复:

o 带有不规则 list() 的 DT 的 rbind() 现在可以正确回收列表项,#2003。添加了测试。

有没有机会rbind()在更早的时候my.dt与不规则长度一起创建list?如果没有,请逐步运行您的代码sapply(my.dt,length)以查看在何处创建了无效长度的列。有了它,我们就可以解决问题并修复潜在的错误。谢谢。

编辑 :

原来的神秘错误信息现在在 v1.8.1 中得到了改进,如下:

DT = list(a=6:1,b=4:1)
setattr(DT,"class",c("data.table","data.frame"))
setkey(DT,a)

Error in setkeyv(x, cols, verbose = verbose) : 
  Column 2 is length 4 which differs from length of column 1 (6). Invalid
  data.table. Check NEWS link at top of ?data.table for latest bug fixes. If
  not already reported and fixed, please report to datatable-help.

data.table注意:不推荐使用这种方法创建一个,因为它可以让你创建一个无效的data.table. 除非,你真的确定它是常规的并且list你确实需要速度(即你想要避免检查的速度),或者你需要证明一个 invalid ,就像我在这里做的那样。as.data.table()data.table()data.table

于 2012-06-13T18:47:16.133 回答