我们偶然发现了一些试图扩展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引发错误的长度不同。
我的猜测:当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参数是标量。