У меня есть data.table с примерно 3 миллионами строк и 40 столбцов. Я хотел бы отсортировать эту таблицу по убыванию в пределах групп, таких как следующий код sql mock:
sort by ascending Year, ascending MemberID, descending Month
Есть ли эквивалентный способ в data.table для этого? Пока я должен разбить его на 2 шага:
setkey(X, Year, MemberID)
Это очень быстро и занимает всего несколько секунд.
X <- X[,.SD[order(-Month)],by=list(Year, MemberID)]
Этот шаг занимает намного больше времени (5 минут).
Обновление:
Кто-то сделал комментарий, чтобы сделать X <- X[sort(Year, MemberID, -Month)]
, а затем удален. Этот подход выглядит намного быстрее:
user system elapsed
5.560 11.242 66.236
Мой подход: setkey(), затем order (-Month)
user system elapsed
816.144 9.648 848.798
Теперь мой вопрос: если я хочу обобщить Year, MemberId и Month после сортировки (Year, MemberID, Month), распознает ли порядок данных? data.table?
Обновление 2: ответ Мэтью Доуле:
После установки с помощью Year, MemberID и Month у меня все еще есть несколько записей для каждой группы. Я хотел бы обобщить для каждой из групп. Я имел в виду: если я использую X [order (Year, MemberID, Month)], то суммирование использует функции бинарного поиска data.table:
monthly.X <- X[, lapply(.SD[], sum), by = list(Year, MemberID, Month)]
Обновление 3: Мэтью D предложил несколько подходов. Время выполнения для первого подхода выполняется быстрее, чем метод order():
user system elapsed
7.910 7.750 53.916
Мэтью: меня удивляло то, что преобразование знака месяца занимает большую часть времени. Без него функция setkey быстро пылает.