【问题标题】:Strange error when expanding data.table展开 data.table 时出现奇怪的错误
【发布时间】:2015-07-07 18:06:19
【问题描述】:

We stumbled upon some strange behaviour trying to expand a data.table.下面的代码可以正常工作:

dt <- data.table(var1=1:2e3, var2=1:2e3, freq=1:2e3)
system.time(dt.expanded <- dt[ ,list(freq=rep(1,freq)),by=c("var1","var2")])
##    user  system elapsed 
##    0.05    0.01    0.06

但是使用下面的data.table

set.seed(1)
dt <- data.table(var1=sample(letters,1000,replace=T),var2=sample(LETTERS,1000,replace=T),freq=sample(1:10,1000,replace=T))

用同样的代码给出

Error in rep(1, freq) : invalid 'times' argument

我的问题
这可能是data.table 中的错误吗?

(我从R Machine Learning Essentials得到了这个例子的语法)

编辑
所以问题似乎出在rep 而不是data.tablerep 的帮助页面显示参数 times

一个整数向量,如果长度为length(x),则给出重复每个元素的(非负)次数,如果长度为1,则重复整个向量。

第二个data.table 创建的times 的长度与引发错误的x 不同。

【问题讨论】:

  • 我没有错误。您使用的是什么版本的 R 和 R Studio。
  • @MikeWise:R 版本 3.1.1,RStudio 版本 0.99.441 - 可能是这样吗?
  • 我使用的是 R 版本 3.1.3,RStudio 版本 0.99.447。
  • 我的 data.table 也是用 3.1.2 版构建的
  • 奇怪的是我没有错误

标签: r data.table


【解决方案1】:

我的猜测:当rep(x,times) 被赋予times 的向量时,它坚持x 的长度相同(而不是在R 和循环中做自然的事情)。所以手动回收工作:

dt[ ,.(rep(rep(1,.N),freq)), by=.(var1,var2)]

似乎是基础 R 中的问题(或者可能是故意的?),而不是 data.table。 OP 在第一个示例中没有遇到这个问题,因为 by=.(var1,var2) 确保每个组只返回一行,因此 times 参数是一个标量。

【讨论】:

  • 那么by 子句与它有什么关系?
  • @vonjd by 子句确保times 是一个标量,而不是一个向量。我会将其添加到答案中。
  • 从技术上讲,R 中没有标量,只有长度为 1 的向量...仍然不能完全理解问题:-(
  • 我使用“标量”作为长度为 1 的向量的简写,是的。
  • @vonjd 尝试dt[,.N,by=.(var1,var2)][,table(N)] 以查看dt 中的不同组大小。如果其中任何一个与1不同,则会抛出错误。
猜你喜欢
  • 2011-01-08
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2020-05-28
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多