【问题标题】:`data.table` error: "reorder received irregular lengthed list" in setkey`data.table` 错误:setkey 中的“重新排序收到的不规则长度列表”
【发布时间】:2012-06-12 20:15:59
【问题描述】:

我在 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" 

【问题讨论】:

  • 您是否尝试将您的列转换为factor
  • 刚试了一下,转换很顺利,但我仍然收到同样的错误。
  • 好的。您能否提供 data.table 的前 10 行?
  • 如前所述,前 10 行键很好。前 100000 行键很好。其他 150000 行关键罚款。不知何故,整个事情都失败了。关键列的前 10 行如下,我找不到任何不符合此格式的行:"CFP.TO" "MCP.AX" "NEC.OL" "LND.PS" "MYRS.KL" "RHBC.KL" "BGRO.KL" "PBT.AX" "MEG.PS" "NOVN.VX"
  • 以前没见过这个。当您提取前 100000 行(或其他)时,您正在制作一个新对象。因此,不知何故,原作中可能有某些东西被破坏了。请需要.Internal(inspect(my.dt))的输出。

标签: r data.table


【解决方案1】:

请运行:

sapply(my.dt, length)

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

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

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

有没有可能在更早的时候创建一个rbind() 和一个不规则长度的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 是常规的并且您确实需要速度(即,对于速度,您希望避免 as.data.table()data.table() 所做的检查),或者您需要证明无效的 data.table,就像我在这里做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2020-03-15
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多