Я пытаюсь выполнить агрегат min
/max
для динамически выбранного столбца в таблице data.table
. Он отлично работает для столбцов numeric
, но я не могу заставить его работать с столбцами Date
, если не создам временный столбец data.table
.
Это работает, когда я использую имя:
dt <- data.table(Index=1:31, Date = seq(as.Date('2015-01-01'), as.Date('2015-01-31'), by='days'))
dt[, .(minValue = min(Date), maxValue = max(Date))]
# minValue maxValue
# 1: 2015-01-01 2015-01-31
Это не работает, когда я использую with=FALSE
:
colName = 'Date'
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
Я могу использовать .SDcols
в числовом столбце:
colName = 'Index'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# minValue maxValue
# 1: 1 31
Но я получаю сообщение об ошибке, когда делаю то же самое для столбца Date:
colName = 'Date'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
Если я использую lapply(.SD, min)
или sapply()
, даты заменяются числами.
Следующее работает и, похоже, не тратит память впустую и работает быстро. есть что-нибудь получше?
a <- dt[, colName, with=F]
setnames(a, 'a')
a[, .(minValue = min(a), maxValue = max(a))]
.SD[[1]]
, потому что.SD
— это список векторов, и вы хотите использовать в нем первый вектор. Длинный ответ: вы, кажется, нашли какую-то странную лазейку, где data.frame всех числовых столбцов может иметь своиmax
иmin
; и я бы не стал основываться на этом странном исключении. - person Frank   schedule 08.11.2015