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.table
。 rep
的帮助页面代表参数times
:
一个整数向量,给出(非负)次数,如果长度为(x),则重复每个元素,或者如果长度为1则重复整个向量。
第二个data.table
创建的times
长度与引发错误的x
不同。
答案 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
参数是标量。