Группировать по нескольким столбцам и суммировать другие несколько столбцов

У меня есть кадр данных с примерно 200 столбцами, из них я хочу сгруппировать таблицу примерно на 10 или около того, которые являются факторами и суммируют остальные столбцы.

У меня есть список всех имен столбцов, которые я хочу сгруппировать, и список всех cols, которые я хочу скопировать.

Формат вывода, который я ищу, должен быть тем же самым фреймворком с таким же количеством столбцов, только что сгруппированным.

Есть ли решение с использованием пакетов data.table, plyr или любого другого?

Ответы

Ответ 1

data.table способ:

DT[, lapply(.SD,sum), by=list(col1,col2,col3,...)]

или

DT[, lapply(.SD,sum), by=colnames(DT)[1:10]]

где .SD - (S) ubset (D) ata, исключая столбцы групп. (Кроме того: если вам нужно ссылаться на столбцы групп в общем случае, они находятся в .BY.)

Ответ 2

Это похоже на задачу для ddply (я использую набор данных "бейсбол", который включен в plyr):

library(plyr)
groupColumns = c("year","team")
dataColumns = c("hr", "rbi","sb")
res = ddply(baseball, groupColumns, function(x) colSums(x[dataColumns]))
head(res)

Это дает каждой группе столбцы сумму столбцов, указанных в dataColumns.

Ответ 3

В базе R это будет...

aggregate( as.matrix(df[,11:200]), as.list(df[,1:10]), FUN = sum)

ИЗМЕНИТЬ: Совокупная функция прошла долгий путь с тех пор, как я написал это. Ничего из вышеперечисленного не требуется.

aggregate( df[,11:200], df[,1:10], FUN = sum )

И есть множество способов написать это. Предполагая, что первые 10 столбцов названы a1 через a10 Мне нравится следующее, хотя оно многословно.

aggregate(. ~ a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10, data = dat, FUN = sum)

(Вы можете использовать пасту для построения формулы и использовать formula)

Ответ 4

Использование plyr:: ddply:

library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))

Ответ 5

dplyr будет:

library(dplyr)
df %>%
  group_by(col1, col2, col3) %>%
  summarise_each(funs(sum))

Вы также можете указать столбцы, которые будут суммированы или исключены из summarise_each, с помощью специальных функций, упомянутых в файле справки ?dplyr::select.

Ответ 6

Простой и правильный способ с data.table, где вы можете выбрать и отменить выбор любых столбцов для группировки и суммирования:

DT[, lapply(.SD,sum), by= eval( colnames( DT[,c(1,2,3:10),with=F][,-c(7,8),with=F] ) ) , .SDcols=colnames( DT[,c(100:200),with=F][,-c(10:20),with=F] ) ]