R dcast.data.table中存在未记录的错误

R dcast.data.table中存在未记录的错误,r,data.table,reshape2,resampling,R,Data.table,Reshape2,Resampling,(这篇文章之前在网站上发布过,但已经有几周没有发表评论了,我做了更多的工作来调试它。) 我遇到了一个奇怪的错误,internet搜索只出现在数据的提交日志中。表: # Error in dcast.data.table(test.table, as.formula(paste(class.col, "+", : # retFirst must be integer vector the same length as nrow(i) 这是在对data.table运行之前测试过的工作dca

(这篇文章之前在网站上发布过,但已经有几周没有发表评论了,我做了更多的工作来调试它。)

我遇到了一个奇怪的错误,internet搜索只出现在
数据的提交日志中。表

# Error in dcast.data.table(test.table, as.formula(paste(class.col, "+",  : 
#   retFirst must be integer vector the same length as nrow(i)
这是在对data.table运行之前测试过的工作dcast.data.table表达式时出现的,我已通过随机重采样
试验
替换对其进行了子集划分。令人不快的部分是:

dcast.data.table(test.table, 
                 Class + Time + Trial ~ Channel,
                 value.var = "Voltage",
                 fun.aggregate=identity)
它似乎被输入表中几乎重复的行阻塞了(即,无论表中是否存在
id
列,错误都是相同的):

什么问题困扰着data.table?我试着改变键,搞乱公式项的顺序,只是为了看看,因为我不理解错误,但那不起作用

如果我用
restrape2
中的常规
dcast
替换函数调用,我会得到一个看似无关的错误:

# Error in vapply(indices, fun, .default) : values must be length 0, but FUN(X[[29]]) result is length 1
此时,在我的代码中,我不关心
试验值是否正确,因此我可以通过在公式中用
id
替换它来解决这个问题,但我感兴趣的是更通用或更健壮的解决方案。

更新:在v1.9.3中修复。发件人:
  • 当指定了
    fun.aggregate
    但返回长度时,
    dcast.data.table
    提供了更好的错误消息1.关闭git。感谢特雷弗·亚历山大的报道

我同意错误消息应该更有助于理解问题,它通常位于data.table中。这只是一个我没有预料到的情况

如果你能把这个问题作为bug归档,我会在有时间的时候修复它


然而,在我看来,你的问题似乎微不足道。从
?dcast.data.table

# Error in dcast.data.table(test.table, as.formula(paste(class.col, "+",  : 
#   retFirst must be integer vector the same length as nrow(i)
fun.aggregate
-是否应在施法之前聚合数据?如果公式没有为每个单元格标识单个观察值,则聚合默认为带有消息的长度

在详细信息部分:“…必须使用fun.aggregate。聚合函数应将向量作为输入,并返回单个值(或长度为1的列表)作为输出。”

在您的示例中,公式的LHS会产生两个相同的行,这意味着必须使用
fun.aggregate
——如果不使用其中一行,则默认为
length
(如
restrape2:::dcast
does)。您使用了
identity
,它只返回值。因此,它返回函数不喜欢的
电压
的两个值

错误消息应类似于:

错误:
fun.aggregate
应为每个唯一组(来自公式的
LHS
)返回一个长度为1的向量,但为组返回
length=2

或者类似的东西。请随意建议更好/更清晰的错误消息


附言:我不明白你所说的近乎重复是什么意思

如果您在LHS上使用
id
列,那么您应该能够获得所需的结果,因为您现在可以唯一地标识行

dcast.data.table(test.table, 
             Class + Time + Trial ~ Channel + id,
             value.var = "Voltage",
             fun.aggregate=identity)

#    Class     Time Trial        1_1        1_2
# 1:     1 201.1495  1169 -0.9923223 -0.9923223
该函数只考虑公式LHS中给定的列,以确定是否存在唯一行,而不是实际输入数据是否具有唯一行(如果这是混淆的话)


要回答OP的第二条评论:

当前获取结果(无错误)的唯一方法是函数返回列表:

dcast.data.table(test.table, 
             Class + Time + Trial ~ Channel,
             value.var = "Voltage",
             fun.aggregate=list)
#    Class     Time Trial                     1
# 1:     1 201.1495  1169 -0.9923223,-0.9923223

然后,您可以检查列的长度是否都为1,如果是,则取消列出。

如果您的示例为1,则会有所帮助。您没有包含示例数据,这样我们就可以准确地运行您的代码并遇到相同的错误。我同意,并且我在问题中提到,我想知道错误的含义,以便我知道如何以简洁的方式重现它,而不是用大量(可能不相关的)数据填充问题我不会说这些错误是不相关的,它们似乎都表明存在返回值不是“应该”的长度的情况。需要一个可复制的示例。尝试找到发生错误的数据的最小子集,然后使用gist.github或类似工具来承载数据。我将其缩小到相同行的
dcast
,并设法获得一个工作示例。我将编辑问题以使其更清楚;很抱歉。我肯定不会对dcast.data.table的行为有任何问题,而且这个错误并不是真的让人恼火,只是让人困惑。我所说的“近似重复”是指输入表不包含重复项(当给定唯一ID时,就像我在
dput
中所做的那样),但我给出的公式会导致生成非唯一行。回到两个月前我编写和测试的一个函数的内部,这些微妙之处都消失了,我很快就忘记了它是如何工作的:)我认为你提出的错误消息非常适合这一点。我在github提交了这个问题。我也同意你对
id
专栏的变通方法——这是我今天讨论的内容(见问题的结尾),但它有点不令人满意,因为它必须根据输入的结构进行处理;如果有某种方法可以“强制唯一性”,而不会对输出的结构产生太大的影响,那就太好了。
dcast.data.table(test.table, 
             Class + Time + Trial ~ Channel + id,
             value.var = "Voltage",
             fun.aggregate=identity)

#    Class     Time Trial        1_1        1_2
# 1:     1 201.1495  1169 -0.9923223 -0.9923223
dcast.data.table(test.table, 
             Class + Time + Trial ~ Channel,
             value.var = "Voltage",
             fun.aggregate=list)
#    Class     Time Trial                     1
# 1:     1 201.1495  1169 -0.9923223,-0.9923223