如何按组获取摘要统计信息

时间:2012-03-23 22:04:25

标签: r s

我试图在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)    

我正在寻找的是在一次通话中获得同一组的多个统计数据,例如mean,min,max,std,...等,这是可行的吗?

12 个答案:

答案 0 :(得分:83)

我会为tapply()投入两美分。

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

您可以使用要替换摘要的特定统计信息编写自定义函数。

答案 1 :(得分:32)

dplyr 包可能是解决此问题的不错方法:

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

答案 2 :(得分:22)

使用Hadley Wickham的purrr包非常简单。使用split将传递的data_frame拆分为组,然后使用mapsummary功能应用于每个组。

library(purrr)

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

答案 3 :(得分:13)

有很多不同的方法可以解决这个问题,但我偏向describeBy包中的psych

describeBy(df$dt, df$group, mat = TRUE) 

答案 4 :(得分:12)

查看plyr包。具体而言,ddply

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

答案 5 :(得分:6)

describeBy外,doBy包是另一种选择。它提供了SAS PROC SUMMARY的大部分功能。细节: http://www.statmethods.net/stats/descriptives.html

答案 6 :(得分:5)

经过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 

答案 7 :(得分:3)

psych软件包为分组摘要统计信息提供了一个很好的选择:

library(psych)
    
describeBy(dt, group="grp")

会产生许多有用的统计数据,包括均值,中位数,范围,标准差和se。

答案 8 :(得分:1)

首先,它取决于您的R版本。如果您已通过2.11,则可以将aggreggate与多个结果函数(摘要,实例或您自己的函数)一起使用。如果没有,你可以使用Justin的答案。

答案 9 :(得分:1)

不知道为什么 popular skimr package 没有被提出。它们的函数 skim()meant to replace the base R summary() 并支持 dplyr 分组:

library(dplyr)
library(skimr)

starwars %>%
  group_by(gender) %>%
  skim()

#> ── Data Summary ────────────────────────
#>                            Values    
#> Name                       Piped data
#> Number of rows             87        
#> Number of columns          14        
#> _______________________              
#> Column type frequency:               
#>   character                7         
#>   list                     3         
#>   numeric                  3         
#> ________________________             
#> Group variables            gender    
#> 
#> ── Variable type: character ──────────────────────────────────────────────────────
#>    skim_variable gender    n_missing complete_rate   min   max empty n_unique
#>  1 name          feminine          0         1         3    18     0       17
#>  2 name          masculine         0         1         3    21     0       66
#>  3 name          <NA>              0         1         8    14     0        4
#>  4 hair_color    feminine          0         1         4     6     0        6
#>  5 hair_color    masculine         5         0.924     4    13     0        9
#>  6 hair_color    <NA>              0         1         4     7     0        4
#> # [...]
#> 
#> ── Variable type: list ───────────────────────────────────────────────────────────
#>   skim_variable gender    n_missing complete_rate n_unique min_length max_length
#> 1 films         feminine          0             1        9          1          5
#> 2 films         masculine         0             1       24          1          7
#> 3 films         <NA>              0             1        3          1          2
#> 4 vehicles      feminine          0             1        3          0          1
#> 5 vehicles      masculine         0             1        9          0          2
#> 6 vehicles      <NA>              0             1        1          0          0
#> # [...]
#> 
#> ── Variable type: numeric ────────────────────────────────────────────────────────
#>   skim_variable gender    n_missing complete_rate  mean     sd    p0   p25   p50
#> 1 height        feminine          1         0.941 165.   23.6     96 162.  166. 
#> 2 height        masculine         4         0.939 177.   37.6     66 171.  183  
#> 3 height        <NA>              1         0.75  181.    2.89   178 180.  183  
#> # [...]

答案 10 :(得分:0)

虽然其他一些方法可行,但这与您正在执行的操作非常接近,仅使用base r。如果您知道聚合命令,则可能更直观。

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

答案 11 :(得分:0)

this 也可以,

spl <- split(mtcars, mtcars$cyl)
list.of.summaries <- lapply(spl, function(x) data.frame(apply(x[,3:6], 2, summary)))
list.of.summaries