我在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"
答案 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}},正如我在这里所做的那样。