Группировать по нескольким столбцам и суммировать другие столбцы
60069 просмотра
6 ответа
У меня есть фрейм данных с примерно 200 столбцами, из которых я хочу сгруппировать таблицу по первым 10 или около того, которые являются факторами, и суммировать остальные столбцы.
У меня есть список всех имен столбцов, по которым я хочу сгруппировать, и список всех столбцов, которые я хочу сгруппировать.
Выходной формат, который я ищу, должен быть одним и тем же кадром данных с одинаковым количеством столбцов, просто сгруппированных вместе.
Есть ли решение с использованием пакетов data.table
, plyr
или любое другое?
Ответы (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
.)
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
)
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:5012 плюса
dplyr
Путь будет выглядеть так :
library(dplyr)
df %>%
group_by(col1, col2, col3) %>%
summarise_each(funs(sum))
Вы можете дополнительно указать столбцы, которые будут суммироваться или исключаться из summarise_each
, используя специальные функции, упомянутые в файле справки ?dplyr::select
.
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
Вопросы из категории :
- r Как получить доступ к последнему значению в векторе?
- r Пакеты оптимизации для R
- r Есть ли у R такие операторские операции, как Perl qw ()?
- r Библиотека / инструмент для рисования тройных / треугольных графиков
- grouping Rails has_many считает количество дочерних строк
- grouping Элементы WPF не отображаются при применении группировки
- grouping Группировка списка кортежей Python
- grouping Есть ли накопитель (), который принимает матрицу как «val»?
- aggregate Как использовать GROUP BY для объединения строк в MySQL?
- aggregate Как проверить существующие агрегатные функции в Postgres?
- aggregate Группировать по нескольким столбцам
- aggregate Я нарушаю свои совокупные границы?
- plyr Объединение агрегированных значений обратно в исходный фрейм данных
- plyr Подмножество фрейма данных с топ-n строк для каждой группы и упорядочены по переменной
- plyr Агрегируйте кадр данных для данного столбца и отобразите другой столбец
- plyr Более быстрые способы вычисления частот и приведение от длинного к широкому
- data.table подмножество в data.table
- data.table Когда мне следует использовать оператор: = в data.table?
- data.table Замена NA с последним значением не-NA