我试图在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,...等,这是可行的吗?
答案 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
拆分为组,然后使用map
将summary
功能应用于每个组。
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)
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