`data.table`错误:在setkey中“重新排序收到不规则的长度列表”

时间:2012-06-12 20:15:59

标签: r data.table

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

setkey(my.dt,my.column)

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

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

我找到了source-code commit with this message,但不能完全解读它的含义。我的键列不包含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" 

1 个答案:

答案 0 :(得分:1)

请运行:

sapply(my.dt, length)

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

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

  带有不规则列表()的DT的rbind()现在回收列表项       正确的,#2003。测试补充。

如果有rbind()之前的my.dt创建list以及不规则加长的sapply(my.dt,length),是否有可能?如果没有,请逐步执行运行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. 的代码,以查看正在创建无效扩展列的位置。有了这个,我们可以解决问题并修复潜在的错误。感谢。

编辑:

现在在v1.8.1中改进了原始的神秘错误消息,如下所示:

data.table

注意:建议不要使用此方法创建data.table,因为它可以让您创建无效的list。除非,您确定as.data.table()是常规的,并且您确实需要速度(即速度要求您避免data.table()data.table做的检查,或者您需要证明无效的{{1}},正如我在这里所做的那样。