Подтвердить что ты не робот

R, суммируя несколько столбцов с data.table

Я пытаюсь использовать data.table для ускорения обработки большого data.frame(300k x 60), сделанного из нескольких меньших объединенных data.frames. Я новичок в data.table. Код до сих пор выглядит следующим образом

library(data.table)
a = data.table(index=1:5,a=rnorm(5,10),b=rnorm(5,10),z=rnorm(5,10))
b = data.table(index=6:10,a=rnorm(5,10),b=rnorm(5,10),c=rnorm(5,10),d=rnorm(5,10))
dt = merge(a,b,by=intersect(names(a),names(b)),all=T)
dt$category = sample(letters[1:3],10,replace=T)

и я задавался вопросом, был ли более эффективный способ, чем следующее, чтобы суммировать данные.

summ = dt[i=T,j=list(a=sum(a,na.rm=T),b=sum(b,na.rm=T),c=sum(c,na.rm=T),
                     d=sum(d,na.rm=T),z=sum(z,na.rm=T)),by=category]

Я не хочу набирать все 50 вычислений столбцов вручную, а eval(paste(...)) кажется неуклюжим.

Я посмотрел пример ниже, но мне кажется, что это немного сложно для моих нужд. спасибо

как обобщить таблицу данных по нескольким столбцам

4b9b3361

Ответ 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

http://datatable.r-forge.r-project.org/datatable-faq.pdf