当尝试为data.table(108个变量)中的每个变量创建12个滞后时,我得到的错误是没有足够的列插槽。此操作应创建大约1200个变量或列。
Data_A = as.data.table (Datos_A)
Varnames = names(Datos_A)
Lagnumber= seq_len(12)
for(y in Varnames) {
for (z in Lagnumber) set(Datos_GO, j = eval(paste0(y,"_lag_",z)), value = shift(Data_A [[y]],n = z, type = "lag"))
}
集合中的错误(Data_A,j = eval(paste0(y,“ lag ”,z)),value = shift(Datos_A [[y]] ,:内部逻辑错误.DT传递给assign 尚未分配足够的列位。 l = 1132,tl = 1132,加1
我尝试使用以下内容,但它无效。
alloc.col(Data_A,3500)
现在在GLobal环境中显示Data_A有3132个变量,但是当使用以下代码时,我得到了同样的错误
for(y in Varnames) {
for (z in Lagnumber) set(Datos_GO, j = eval(paste0(y,"_lag_",z)), value = shift(Data_A [[y]],n = z, type = "lag"))
}
集合出错(Datos_GO,j = eval(paste0(y,“ lag ”,z)),value = shift(Datos_GO [[y]] ,:内部逻辑错误.DT传递给assign 尚未分配足够的列位。 l = 6632,tl = 6632,加1
该代码在原始data.table中只有大约80个变量正常工作。但我不明白为什么这不适用于30多个。
示例数据: https://ufile.io/3ka6g
示例数据上的错误和代码
library(readxl)
> Data_A <- read_excel("C:/Example_data_source_108variables.xlsx")
> library(data.table)
data.table 1.10.4.3
The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
Documentation: ?data.table, example(data.table) and browseVignettes("data.table")
Release notes, videos and slides: http://r-datatable.com
> Data_A = as.data.table (Data_A)
> Varnames = names(Data_A)
> Lagnumber= seq_len(12)
> for(y in Varnames){for (z in Lagnumber) set(Data_A, j = eval(paste0(y,"_lag_",z)), value = shift(Data_A [[y]],n = z, type = "lag"))}
Error in set(Data_A, j = eval(paste0(y, "_lag_", z)), value = shift(Data_A[[y]], :
Internal logical error. DT passed to assign has not been allocated enough column slots. l=1132, tl=1132, adding 1
答案 0 :(得分:2)
当我运行OP的代码片段时,我也遇到了相同的错误消息。数据过于冗长,无法在此处作为输入发布。
以下是使用评论中提到的长格式的解决方法:
if (std::is_pointer<elem>::value)
sessionInfo()
Varnames <- copy(names(Data_A))
Data_A[, (names(Data_A)) := lapply(.SD, as.numeric)][,
rn := .I]
melted <- melt(Data_A, id.vars="rn")[,
(paste0("lag_", seq_len(12))) := shift(value, seq_len(12), type="lag"),
by=variable][,
value:=NULL][]
res <- dcast.data.table(melt(melted, id.vars=c("rn", "variable"), variable.name="lag"),
rn ~ variable + lag, sum)
#view results
res[, ncol(res), with=FALSE]