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

von*_*njd 3 r data.table

我们偶然发现了一些试图扩展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
Run Code Online (Sandbox Code Playgroud)

但是使用以下 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))
Run Code Online (Sandbox Code Playgroud)

用相同的代码给

Error in rep(1, freq) : invalid 'times' argument
Run Code Online (Sandbox Code Playgroud)

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

(我从R Machine Learning Essentials获得了此示例的语法)

编辑
因此,问题似乎真的出在与rep而不在data.table。说明的帮助页面rep中的参数times

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

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

Fra*_*ank 5

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

dt[ ,.(rep(rep(1,.N),freq)), by=.(var1,var2)]
Run Code Online (Sandbox Code Playgroud)

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