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


75

我试图一次按类别列将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)    

我正在寻找的是在一次调用中获取同一组的多个统计信息,例如均值,最小值,最大值,标准,...等,这可行吗?


2
这是一个非常基本的问题,有多个答案。您可能不熟悉RSeek (LINK)和sos库(LINK), 这两者都是帮助您找出问题答案的绝佳资源。使用这些资源,您将能够在几秒钟内回答您自己的问题。
泰勒·林克

data <- c(行的末尾还有一个逗号。
BenBarnes 2012年

我刚刚发现了一个很棒的R包。您可以根据需要按任意类别对数据进行制表,并为多个变量计算多个统计信息-确实很棒!但是,等等,还有更多!该软件包具有为表格生成LaTeX代码的功能,可轻松导入到文档中。
StatGrrl 2014年

Answers:


111

我会花两美分tapply()

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

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


2
@maximusyoda,要获取科学计数法,请使用自定义函数,summary例如:tapply(df$dt, df$group, function(x) format(summary(x), scientific = TRUE))
BenBarnes 2014年

45

dplyr软件包可以很好地替代此问题:

library(dplyr)

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

获得第一象限和第三象限

df %>% 
  group_by(group) %>% 
  summarize(q1 = quantile(dt, 0.25),
            q3 = quantile(dt, 0.75))

33

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

library(purrr)

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

2
df%>%group_by(group)%>%do(data.frame(summary(。)))在dplyr中应该做类似的事情
AlexR

1
这似乎产生相同的输出作为tapply使用基R.方法
dsaxton

17

有很多不同的方法可以解决此问题,但我偏爱describeBypsych软件包:

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

12

看一下plyr包装。特别,ddply

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

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 


4

psych软件包对于分组汇总统计信息而言是一个不错的选择:

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

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


3

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

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

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.