не удается установить истинную длину ALTREP

#r #data.table

#r #данные.таблица

Вопрос:

У меня есть некоторый код, который работал нормально, пока я не обновился до версии R 4.0.2.

 colnames <- c("Wind")
type <- "Month"
temp <- setDT(airquality)[, lapply(.SD, sum), keyby = Month, .SDcols = colnames]
colnames_new <- paste0(colnames, "_", type)
setnames(temp, c("Month", colnames_new))
setDT(airquality)[, (colnames_new) := temp[i = airquality[, .(Month)], j = -1, on = "Month"]]
  

Теперь я получаю сообщение об ошибке:

Ошибка в .shallow(x, cols = cols, сохранить.key = TRUE): не удается установить истинную длину ALTREP

Я использую data.table 1.13.0. У кого-нибудь такая же проблема?

Комментарии:

1. Откуда ipcal берется? setDT(airquality) выдает ошибку в моей системе. data.table(airquality) должны быть достигнуты ожидаемые результаты.

2. извините, это также должно быть airquality

3. Кстати, setDT работает на побочном эффекте. Хотя он возвращает объект с классом data.table , он также изменяет этот атрибут на месте , поэтому после того, как вы сначала выполните setDT(airquality) в строке 3, этот фрейм равен a data.table , setDT в строке 6 нет необходимости. (Если вам нужен функциональный механизм без побочных эффектов, используйте as.data.table(airquality) , хотя, похоже, здесь это не требуется.

Ответ №1:

Вот примерно то, что я мог бы сделать

 library(data.table)
aqDT <- data.table(airquality)
cln <- "Wind" # colnames is a function in base R, better not add confusion
aqDT[, paste0(cln, "_Month") := sum(get(cln)), by = Month]
aqDT

#      Ozone Solar.R Wind Temp Month Day Wind_Month
#   1:    41     190  7.4   67     5   1      360.3
#   2:    36     118  8.0   72     5   2      360.3
#   3:    12     149 12.6   74     5   3      360.3
#   4:    18     313 11.5   62     5   4      360.3
#   5:    NA      NA 14.3   56     5   5      360.3
#  ---                                             
# 149:    30     193  6.9   70     9  26      305.4
# 150:    NA     145 13.2   77     9  27      305.4
# 151:    14     191 14.3   75     9  28      305.4
# 152:    18     131  8.0   76     9  29      305.4
# 153:    20     223 11.5   68     9  30      305.4
  

Ответ №2:

Перед любой стандартной операцией с фреймом данных (например, с помощью dplyr) убедитесь, что вы превратили datatable в фрейм данных

 mydatatable = as.data.frame(mydatatable) 

# DO your dplyr or standard dataframe operations
# now use setDT(mydatatable) or   mydatatable = as.data.table(mydatatable) 

 mydatatable = as.data.table(mydatatable) 

# do your datatable operations 
  

Комментарии:

1. Я пробовал это. Но это означало бы, что каждый раз, прежде чем я использую setDT, я должен переходить на dataframe? В противном случае первый setDT будет работать, но со следующим возникает та же ошибка. У меня такое ощущение, что проблема больше связана с размером данных (данные очень большие).