data.table и “должен оценить для списка” Ошибки

Я хотел бы использовать 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 параметр.

7
задан Ryan R. Rosario 15 July 2010 в 03:41
поделиться

2 ответа

Я внес два изменения в исходный код:

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]]) 
}

Числовой вектор возраст должен быть преобразован в факторы. Что касается параметра по параметру , не используйте кавычки для имен столбцов, а сгруппируйте их в список (...). По крайней мере, это то, что предлагает автор.

4
ответ дан 7 December 2019 в 03:10
поделиться

[ОБНОВЛЕНИЕ] 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 сообщений в месяц, которые тоже могут быть интересны.

5
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: