Я хотел бы использовать data.table пакет в R для динамичной генерации агрегирований, но я сталкиваюсь с ошибкой. Ниже, позволить my.dt
имейте тип data.table
.
sex <- c("M","F","M","F")
age <- c(19, 23, 26, 21)
dependent.variable <- c(1400, 1500, 1250, 1100)
my.dt <- data.table(sex, age, dependent.variable)
grouping.vars <- c("sex", "age")
for (i in 1:2) {
my.dt[,sum(dependent.variable), by=grouping.vars[i]]
}
Если я выполняю это, я получаю ошибки:
Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i] :
by must evaluate to list
Все же следующие работы без ошибки:
my.dt[,sum(dependent.variable), by=sex]
Я вижу, почему ошибка происходит, но я не вижу, как использовать вектор с by
параметр.
Я внес два изменения в исходный код:
sex <- c("M","F","M","F")
age <- c(19, 23, 26, 21)
age<-as.factor(age)
dependent.variable <- c(1400, 1500, 1250, 1100)
my.dt <- data.table(sex, age, dependent.variable)
for ( a in 1:2){
print(my.dt[,sum(dependent.variable), by=list(sex,age)[a]])
}
Числовой вектор возраст
должен быть преобразован в факторы. Что касается параметра по параметру
, не используйте кавычки для имен столбцов, а сгруппируйте их в список (...). По крайней мере, это то, что предлагает автор.
[ОБНОВЛЕНИЕ] 2 года спустя после того, как был задан вопрос ...
При запуске кода в вопросе data.table
теперь более полезен и возвращает это (с использованием 1.8.2):
Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i]) :
'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...)
if you can. Otherwise, by=eval(grouping.vars[i]) should work. This is for efficiency
so data.table can detect which columns are needed.
и следуя совету во втором предложении ошибки:
my.dt[,sum(dependent.variable), by=eval(grouping.vars[i])]
sex V1
1: M 2650
2: F 2600
Старый ответ от июля 2010 г. ( от
теперь может быть двойным
и символом
, хотя):
Строго говоря, от
требует чтобы оценить список векторов, каждый из которых имеет целое число режима хранения. Таким образом, числовой вектор age
также может быть приведен к целому числу с помощью as.integer ()
. Это связано с тем, что data.table использует сортировку по основанию (очень быстро), но алгоритм Radix специально предназначен только для целых чисел (см. Запись в Википедии о «сортировке по основанию»). Целочисленное хранилище для ключевых столбцов и специальные по
- одна из причин, по которой data.table работает быстро. Фактор - это, конечно, целочисленный поиск уникальных строк.
Идея по
как list ()
выражений заключается в том, что вы не ограничены именами столбцов. Обычно выражения имен столбцов записываются непосредственно в по
. Распространенным является агрегирование по месяцам; например:
DT[,sum(col1), by=list(region,month(datecol))]
или очень быстрый способ группировки по годам-месяцам - использовать дату, не основанную на эпохе, например ггггммддЛ, как показано в некоторых примерах пакета, например:
DT[,sum(col1), by=list(region,month=datecol%/%100L)]
Обратите внимание, как вы можете назвать столбцы внутри списка () вот так.
Чтобы определить и повторно использовать сложные выражения группировки:
e = quote(list(region,month(datecol)))
DT[,sum(col1),by=eval(e)]
DT[,sum(col2*col3/col4),by=eval(e)]
Или, если вы не хотите повторно вычислять выражения по
каждый раз, вы можете сохранить результат один раз и повторно использовать результат для повышения эффективности; если сами выражения by
занимают много времени для вычисления / выделения или вам необходимо повторно использовать их много раз:
byval = DT[,list(region,month(datecol))]
DT[,sum(col1),by=byval]
DT[,sum(col2*col3/col4),by=byval]
См. http: //datatable.r-forge.r-project .org / для получения последней информации и статуса. Скоро будет новая презентация, и мы надеемся вскоре выпустить v1.5 для CRAN. Он содержит несколько исправлений ошибок и новых функций, подробно описанных в файле NEWS. Список справочной информации содержит около 30-40 сообщений в месяц, которые тоже могут быть интересны.