Как получить сводную статистику по группам - PullRequest
53 голосов
/ 24 марта 2012

Я пытаюсь получить несколько сводных статистических данных в R / S-PLUS, сгруппированных по категориальным столбцам в одном кадре. Я нашел пару функций, но все они делают одну статистику за вызов, как, например, aggregate ().

data <- c(62, 60, 63, 59, 63, 67, 71, 64, 65, 66, 68, 66, 
          71, 67, 68, 68, 56, 62, 60, 61, 63, 64, 63, 59)
grp <- factor(rep(LETTERS[1:4], c(4,6,6,8)))
df <- data.frame(group=grp, dt=data)
mg <- aggregate(df$dt, by=df$group, FUN=mean)    
mg <- aggregate(df$dt, by=df$group, FUN=sum)    

То, что я ищу, - это получить несколько статистических данных для одной и той же группы, например, среднее, минимальное, максимальное, стандартное ... и т. Д. За один вызов, это выполнимо?

Ответы [ 9 ]

85 голосов
/ 24 марта 2012

Я положу свои два цента за tapply().

tapply(df$dt, df$group, summary)

Вы можете написать пользовательскую функцию с конкретной статистикой, которую хотите заменить сводкой.

33 голосов
/ 10 ноября 2014
Пакет

dplyr может быть хорошей альтернативой этой проблеме:

library(dplyr)

df %>% 
  group_by(group) %>% 
  summarize(mean = mean(dt),
            sum = sum(dt))

Чтобы получить 1-й и 3-й квадранты

df %>% 
  group_by(group) %>% 
  summarize(q1 = quantile(dt, 0.25),
            q3 = quantile(dt, 0.75))
22 голосов
/ 12 августа 2016

Используя пакет purrr Хэдли Уикхэма, это довольно просто. Используйте split, чтобы разделить переданный data_frame на группы, затем используйте map, чтобы применить функцию summary к каждой группе.

library(purrr)

df %>% split(.$group) %>% map(summary)
13 голосов
/ 24 марта 2012

Есть много разных способов, но я неравнодушен к describeBy в пакете psych:

describeBy(df$dt, df$group, mat = TRUE) 
12 голосов
/ 24 марта 2012

взгляните на пакет plyr.В частности, ddply

ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt))
6 голосов
/ 23 января 2017

через 5 долгих лет, я уверен, что этому ответу не будет уделено много внимания, но все же, чтобы завершить все варианты, вот тот, с data.table

library(data.table)
setDT(df)[ , list(mean_gr = mean(dt), sum_gr = sum(dt)) , by = .(group)]
#   group mean_gr sum_gr
#1:     A      61    244
#2:     B      66    396
#3:     C      68    408
#4:     D      61    488 
6 голосов
/ 26 декабря 2013

Помимо describeBy, пакет doBy является еще одним вариантом. Он обеспечивает большую часть функциональности SAS PROC РЕЗЮМЕ. Подробности: http://www.statmethods.net/stats/descriptives.html

1 голос
/ 24 марта 2012

Во-первых, это зависит от вашей версии R. Если вы прошли 2.11, вы можете использовать агрегат с несколькими функциями результатов (сводка, например, или ваша собственная функция).Если нет, вы можете использовать ответ Джастина.

0 голосов
/ 22 апреля 2019

Хотя некоторые другие подходы работают, это довольно близко к тому, что вы делали, и использует только базу r.Если вы знаете команду aggregate, это может быть более интуитивно понятно.

with( df , aggregate( dt , by=list(group) , FUN=summary)  )
...