Группировать по нескольким столбцам и суммировать другие несколько столбцов
У меня есть кадр данных с примерно 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]
)
]