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

use*_*220 61 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)    
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*nes 94

我会把我的两美分换掉tapply().

tapply(df$dt, df$group, summary)
Run Code Online (Sandbox Code Playgroud)

您可以编写一个自定义函数,其中包含要替换摘要的特定统计信息.

  • @maximusyoda,要获得科学记数法,请使用自定义函数而不是 `summary`,例如:`tapply(df$dt, df$group, function(x) format(summary(x), science = TRUE))` (4认同)
  • @JorgeParedes,你的意思是汇总统计列表吗?我通常使用“data.table”包来进行此类操作。我将用一个例子来更新答案。 (2认同)

Jot*_* eN 37

dplyr包可能是这个问题的不错的选择:

library(dplyr)

df %>% 
  group_by(group) %>% 
  summarize(mean = mean(dt),
            sum = sum(dt))
Run Code Online (Sandbox Code Playgroud)


con*_*nor 24

使用Hadley Wickham的purrr包这很简单.使用split分裂传递data_frame成团,再使用map的应用summary功能,每个组.

library(purrr)

df %>% split(.$group) %>% map(summary)
Run Code Online (Sandbox Code Playgroud)

  • df %&gt;% group_by(group) %&gt;% do(data.frame(summary(.))) 应该在 dplyr 中做类似的事情 (2认同)

Jim*_* M. 15

有很多不同的方法可以解决这个问题,但我不喜欢describeBy这个psych方案:

describeBy(df$dt, df$group, mat = TRUE) 
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 12

看看plyr包装.特别,ddply

ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt))
Run Code Online (Sandbox Code Playgroud)


joe*_*son 7

经过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 
Run Code Online (Sandbox Code Playgroud)


dws*_*stu 6

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


小智 6

psych软件包有一个很好的分组汇总统计选项:

library(psych)
    
describeBy(dt, group="grp")
Run Code Online (Sandbox Code Playgroud)

产生许多有用的统计数据,包括均值、中值、范围、sd、se。


MS *_*nds 6

不知道为什么流行的skimr软件包还没有被提出\xe2\x80\x99。它们的功能skim()旨在替换基本 Rsummary()并支持dplyr分组:

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


Mat*_*ewR 5

虽然其他一些方法有效,但这与您所做的非常接近,并且仅使用基数 r。如果您知道聚合命令,这可能更直观。

with( df , aggregate( dt , by=list(group) , FUN=summary)  )
Run Code Online (Sandbox Code Playgroud)