没有足够的列插槽

时间:2018-03-29 09:04:08

标签: r data.table

当尝试为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

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]