展开时出现奇怪的错误 data.table
Strange error when expanding 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.table
。 rep
的帮助页面对参数 times
说:
A integer vector giving the (non-negative) number of times to repeat each element if of length length(x), or to repeat the whole vector if of length 1.
第二个 data.table
创建的 times
与 x
的长度不同,这会引发错误。
我的猜测:当 rep(x,times)
被赋予 times
的向量时,它坚持认为 x
是相同的长度(而不是在 R 中做自然的事情和回收)。所以手动回收有效:
dt[ ,.(rep(rep(1,.N),freq)), by=.(var1,var2)]
似乎是 base R 的问题(或者可能是故意的?),而不是 data.table
。 OP 在第一个示例中没有遇到这个问题,因为 by=.(var1,var2)
确保每个组只返回一行,所以 times
参数是一个标量。
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
说:
A integer vector giving the (non-negative) number of times to repeat each element if of length length(x), or to repeat the whole vector if of length 1.
第二个 data.table
创建的 times
与 x
的长度不同,这会引发错误。
我的猜测:当 rep(x,times)
被赋予 times
的向量时,它坚持认为 x
是相同的长度(而不是在 R 中做自然的事情和回收)。所以手动回收有效:
dt[ ,.(rep(rep(1,.N),freq)), by=.(var1,var2)]
似乎是 base R 的问题(或者可能是故意的?),而不是 data.table
。 OP 在第一个示例中没有遇到这个问题,因为 by=.(var1,var2)
确保每个组只返回一行,所以 times
参数是一个标量。