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

r grouping aggregate plyr data.table

60069 просмотра

6 ответа

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

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

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

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

Автор: user1042267 Источник Размещён: 22.10.2019 07:38

Ответы (6)


18 плюса

Способ 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.)

Автор: Matt Dowle Размещён: 21.11.2011 02:01

18 плюса

В базе 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)

Автор: John Размещён: 21.11.2011 02:40

16 плюса

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

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

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

Автор: Paul Hiemstra Размещён: 21.11.2011 01:50

12 плюса

dplyrПуть будет выглядеть так :

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

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

Автор: docendo discimus Размещён: 22.10.2015 03:04

10 плюса

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

library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))
Автор: Luciano Selzer Размещён: 21.11.2011 01:46

1 плюс

Другой способ сделать это с помощью dplyr, который будет общим (не нужен список столбцов):

df %>% group_by_if(is.factor) %>% summarize_if(is.numeric,sum,na.rm = TRUE)
Автор: Michael Johnson Размещён: 19.03.2018 05:43
Вопросы из категории :
32x32