web-dev-qa-db-ja.com

グループごとに要約統計を取得する方法

R/S-PLUSで複数の要約統計をカテゴリ別の列ごとにまとめて取得しようとしています。いくつかの関数を見つけましたが、それらはすべて、 `aggregate()のように、呼び出しごとに1つの統計を行います。

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)    

私が探しているのは、同じグループの平均、最小、最大、標準などの複数の統計情報を1回の呼び出しで取得することです、それは実行可能ですか?

56
user1289220

tapply()に2セントを割り当てます。

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

要約を置き換える特定の統計情報を含むカスタム関数を作成できます。

87
BenBarnes

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))
36
Jot eN

Hadley Wickhamのpurrrパッケージを使用すると、これは非常に簡単です。 splitを使用して、渡されたdata_frameをグループに分割し、mapを使用してsummary関数を各グループに適用します。

library(purrr)

df %>% split(.$group) %>% map(summary)
23
conor

これについてはさまざまな方法がありますが、私はdescribeByパッケージのpsychには賛成していません。

describeBy(df$dt, df$group, mat = TRUE) 
13
Jim M.

plyrパッケージを見てください。具体的には、ddply

ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt))
12
Justin

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
joel.wilson

describeByに加えて、doByパッケージは別のオプションです。 SAS PROC SUMMARYの多くの機能を提供します。詳細: http://www.statmethods.net/stats/descriptives.html

6
dwstu

他のアプローチのいくつかは機能しますが、これはあなたがやっていることにかなり近く、ベースrのみを使用します。集約コマンドを知っている場合、これはより直感的かもしれません。

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

まず、Rのバージョンに依存します。2.11をパスした場合、複数の結果関数(要約、インスタンスごと、または独自の関数)でaggreggateを使用できます。そうでない場合は、ジャスティンの答えを使用できます。

1
CPHM