扩展data.table时出现奇怪的错误

时间:2015-07-07 18:06:20

标签: r data.table

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

  

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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