Как суммировать переменную группой

Скажем, у меня есть два столбца данных. Первое содержит категории такой как "Первые", "Вторые", "Третьи" и т.д. Второе имеет числа, которые представляют количество раз, которое я видел "Сначала".

Например:

Category     Frequency
First        10
First        15
First        5
Second       2
Third        14
Third        20
Second       3

Я хочу отсортировать данные по категориям и суммировать Частоты:

Category     Frequency
First        30
Second       5
Third        34

Как я сделал бы это в R?

320
задан NelsonGon 2 April 2019 в 18:46
поделиться

5 ответов

Использование агрегата :

aggregate(x$Frequency, by=list(Category=x$Category), FUN=sum)
  Category  x
1    First 30
2   Second  5
3    Third 34

В приведенном выше примере в списке можно указать несколько измерений. Несколько агрегированных показателей одного и того же типа данных могут быть включены с помощью cbind :

aggregate(cbind(x$Frequency, x$Metric2, x$Metric3) ...

(добавление комментария @thelatemail), aggregate также имеет интерфейс формул

aggregate(Frequency ~ Category, x, sum)

Или, если вы хотите, агрегировать несколько столбцов, вы можете использовать . обозначение (работает и для одного столбца)

aggregate(. ~ Category, x, sum)

или tapply :

tapply(x$Frequency, x$Category, FUN=sum)
 First Second  Third 
    30      5     34 

Используя эти данные:

x <- data.frame(Category=factor(c("First", "First", "First", "Second",
                                      "Third", "Third", "Second")), 
                    Frequency=c(10,15,5,2,14,20,3))
355
ответ дан 23 November 2019 в 00:58
поделиться

Это в некоторой степени связано с этим вопросом .

Вы также можете просто использовать функцию by () :

x2 <- by(x$Frequency, x$Category, sum)
do.call(rbind,as.list(x2))

Те другие пакеты (plyr, reshape) имеют то преимущество, что возвращают data.frame, но с этим стоит ознакомиться с помощью () так как это базовая функция.

36
ответ дан 23 November 2019 в 00:58
поделиться
library(plyr)
ddply(tbl, .(Category), summarise, sum = sum(Frequency))
25
ответ дан 23 November 2019 в 00:58
поделиться

Если x - это фрейм данных с вашими данными, то следующее будет делать то, что вы хотите:

require(reshape)
recast(x, Category ~ ., fun.aggregate=sum)
19
ответ дан 23 November 2019 в 00:58
поделиться

Просто чтобы добавить третий вариант:

require(doBy)
summaryBy(Frequency~Category, data=yourdataframe, FUN=sum)

РЕДАКТИРОВАТЬ: это очень старый ответ. Теперь я бы рекомендовал использовать group_by и summarize из dplyr , как в ответе @docendo.

16
ответ дан 23 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: