R dcast.data.table中存在未记录的错误
(这篇文章之前在网站上发布过,但已经有几周没有发表评论了,我做了更多的工作来调试它。) 我遇到了一个奇怪的错误,internet搜索只出现在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
数据的提交日志中。表
:
# 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