我试图在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)
您可以编写一个自定义函数,其中包含要替换摘要的特定统计信息.
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)
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)
经过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)
此外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。
不知道为什么流行的skimr软件包还没有被提出\xe2\x80\x99。它们的功能skim()旨在替换基本 Rsummary()并支持dplyr分组:
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#> # [...]\nRun Code Online (Sandbox Code Playgroud)\n
虽然其他一些方法有效,但这与您所做的非常接近,并且仅使用基数 r。如果您知道聚合命令,这可能更直观。
with( df , aggregate( dt , by=list(group) , FUN=summary) )
Run Code Online (Sandbox Code Playgroud)