Ответ 1
Вы можете использовать простой оператор lapply
с .SD
dt[, lapply(.SD, sum, na.rm=TRUE), by=category ]
category index a b z c d
1: c 19 51.13289 48.49994 42.50884 9.535588 11.53253
2: b 9 17.34860 20.35022 10.32514 11.764105 10.53127
3: a 27 25.91616 31.12624 0.00000 29.197343 31.71285
Если вы хотите обобщить только определенные столбцы, вы можете добавить аргумент .SDcols
# note that .SDcols also allows reordering of the columns
dt[, lapply(.SD, sum, na.rm=TRUE), by=category, .SDcols=c("a", "c", "z") ]
category a c z
1: c 51.13289 9.535588 42.50884
2: b 17.34860 11.764105 10.32514
3: a 25.91616 29.197343 0.00000
Это, конечно, не ограничивается sum
, и вы можете использовать любую функцию с lapply
, включая анонимные функции. (т.е. это регулярный оператор lapply
).
Наконец, нет необходимости использовать i=T
и j= <..>
. Лично я считаю, что код становится менее читаемым, но это просто предпочтение стиля.
EDIT: Документация
Вы найдете документацию к .SD
и нескольким другим специальным переменным в разделе
раздел справки ?"[.data.table"
(в разделе "Аргументы" смотрите информацию для by
).
Также ознакомьтесь с data.table FAQ 2.1