#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, этот фрейм равен adata.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 будет работать, но со следующим возникает та же ошибка. У меня такое ощущение, что проблема больше связана с размером данных (данные очень большие).