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

105

我正在尝试在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(链接)和sos库(链接)。它们都是非常好的资源,可以帮助你找到答案。我敢打赌,有了这些资源,你能在几秒钟内回答自己的问题。 - Tyler Rinker
data <- c( 行末有多余逗号。 - BenBarnes
我刚刚发现了一个非常棒的 R 包 tables。你可以按照任意多个类别对数据进行表格化,并针对多个变量计算多个统计数据 - 真的非常神奇!但是,还有更多好处!该包还具有用于生成 LaTeX 代码以便于将表格轻松导入文档的功能。 - StatGrrl
15个回答

4

在更新的(>1.0)版本的dplyr中,您可以使用以下方法:

iris %>% 
  group_by(Species)  %>% 
  summarise(as_tibble(rbind(summary(Sepal.Length))))

这是因为如果参数计算出一个数据框,dplyr会将summarise的结果拆分为列。

2

我还建议使用gtsummary(由Daniel D. Sjoberg等人编写)。您可以使用该软件包生成出版物或演示文稿所需的表格。在此问题中,使用gtsummary解决方案如下:

library(tidyverse)
library(gtsummary)

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)


tbl_summary(df, 
            by=group,
            type = all_continuous() ~ "continuous2",
            statistic = all_continuous() ~ c("{mean} ({sd})","{median} ({IQR})", "{min}- {max}"), ) %>% 
  add_stat_label(label = dt ~ c("Mean (SD)","Median (Inter Quant. Range)", "Min- Max"))

然后您就会得到以下输出结果:
特征 A,N = 4 B,N = 6 C,N = 6 D,N = 8
dt
平均值(标准差) 61.0(1.8) 66.0(2.8) 68.0(1.7) 61.0(2.6)
中位数(四分位距) 61.0(2.5) 65.5(2.5) 68.0(0.8) 61.5(3.2)
最小值-最大值 59.0 - 63.0 63.0 - 71.0 66.0 - 71.0 56.0 - 64.0
您还可以通过以下方式将表格导出为Word文档:
Table1 <-  tbl_summary(df, 
                by=group,
                type = all_continuous() ~ "continuous2",
                statistic = all_continuous() ~ c("{mean} ({sd})","{median} ({IQR})", "{min}- {max}"), ) %>% 
      add_stat_label(label = dt ~ c("Mean (SD)","Median (Inter Quant. Range)", "Min- Max"))

tmp1 <- "~path/name.docx"

Table1 %>% 
  as_flex_table() %>% 
  flextable::save_as_docx(path=tmp1)

您可以将其用于回归输出。有关更多信息,请参阅软件包参考手册和软件包网页。 https://cran.r-project.org/web/packages/gtsummary/index.html https://www.danieldsjoberg.com/gtsummary/index.html

1

this 也可能起作用,

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

1

首先,这取决于您使用的R版本。如果您使用的是2.11及以上版本,则可以使用多个结果函数(例如summary、by instance或您自己的函数)来使用aggreggate函数。否则,您可以使用Justin提供的答案。


0

collapse通过qsu提供了一个非常灵活的功能,用于汇总统计数据:

library(collapse)
with(df, qsu(dt, g = group))

#    N  Mean      SD  Min  Max
# A  4    61  1.8257   59   63
# B  6    66  2.8284   63   71
# C  6    68  1.6733   66   71
# D  8    61  2.6186   56   64

它也非常快速:
microbenchmark::microbenchmark(
  tapply = tapply(df$dt, df$group, summary),
  dt = setDT(df)[, as.list(summary(dt)), by = group],
  collapse = qsu(df$dt, g = df$group),
  purrr = df %>% split(.$group) %>% purrr::map(summary)
)

# Unit: microseconds
#      expr    min      lq     mean  median     uq    max neval
#    tapply  453.2  503.75  531.718  522.70  548.6  946.8   100
#        dt  998.8 1076.90 1288.057 1127.55 1205.9 9569.6   100
#  collapse   14.8   24.45   38.432   36.90   43.9  121.6   100
#     purrr 2553.6 2728.85 2847.378 2816.75 2940.8 3715.8   100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接