这是一个功能
f <- function(orderData){
colNames <- paste0("lim_",sort(unique(orderData[,XLM])))
orderData[, (colNames):={lim_=factor(XLM);lapply(data.table(model.matrix(~ lim_:w_qalim + 0)), cumsum)}]
}
和一些示例数据
dt = data.table(XLM=sample(1L:300L,5e4,T), w_qalim=sample(1L:5L,5e4,T))
dt1 = data.table(XLM=sample(1L:300L,1e2,T), w_qalim=sample(1L:5L,1e2,T))
执行f(dt)
并不会在我的框中通过引用更新dt
,而是f(dt1)
。是期望/与datatable.alloccol
答案 0 :(得分:4)
在这两种情况下,数据表的长度为2,真实长度为100:
> length(dt); truelength(dt)
[1] 2
[1] 100
> length(dt1); truelength(dt1)
[1] 2
[1] 100
然而,在dt
colNames
为300的情况下,2 + 300超过了真实长度,但在dt1
colNames
的情况下是81,所以2 + 81确实不
您可以提前分配更大的真实长度,例如
alloc.col(dt, 1000)
或者您可以设置默认值,以便所有数据表都具有更大的默认值:
options(datatable.alloccol = 1000)
请参阅?alloc.col
,