R: data.table .dynamic агрегации по столбцу Date столбцы
Я пытаюсь сделать 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
Но я получаю ошибку, когда делаю то же самое для столбца Дата:
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))]
1 ответ
С первой попытки:
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
Вы должны просто прочитать Введение в виньетку data.table, чтобы понять, что with=
средства. Это проще, если вы знаете with()
функция от базы R.
На втором:
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
Это похоже на проблему с min()
а также max()
на data.frame/data.table с колонкой с атрибутами. Вот MRE.
df = data.frame(x=as.Date("2015-01-01"))
min(df)
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
Чтобы ответить на ваш вопрос, вы можете использовать get()
:
dt[, .(min = min(get(colName)), max = max(get(colName)))]
Или, как предложил @Frank, [[
Оператор для подстановки столбца:
dt[, .(min = min(.SD[[colName]]), max = max(.SD[[colName]]))]
Там еще нет лучшего способа применения .SD
к нескольким функциям (потому что у base R, похоже, нет одного AFAICT, а data.table пытается максимально использовать функции base R). Есть FR #1063 для решения этой проблемы. Если / когда это будет реализовано, то можно сделать, например:
# NOTE: not yet implemented, FR #1063
dt[, colwise(.SD, min, max), .SDcols = colName]