前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言 分组计算,不止group_by

R语言 分组计算,不止group_by

作者头像
拴小林
发布2020-07-10 15:45:32
7.8K1
发布2020-07-10 15:45:32
举报
文章被收录于专栏:数据驱动实践数据驱动实践

最近在研究excel透视图,想到好像自己在R-分组操作并不是很流畅,顺便学习分享一下。R自带数据集比较多,今天就选择一个我想对了解的mtcars数据集带大家学习一下R语言中的分组计算(操作)。

目录

1 dplyr包中的group_by联合summarize

1.1 group_by语法

1.2 summarise语法

1.3 group_by和summarise单变量分组计算

1.4 group_by和summarise多变量分组计算

2 ddply

2.1 ddply语法

2.2 ddply分组计算示例

3 aggregate

3.1 aggregate语法

3.2 aggregate分组计算示例

3.3 aggregate分组计算补充(formula形式)

4 splite


正文

首先给大家看一下mtcars数据集的基本情况,data.frame类型,32个观测对象,11个变量。

代码语言:javascript
复制
> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
> str(mtcars)
'data.frame':  32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

1 dplyr包中的group_by联合summarize

1.1 group_by语法

代码语言:javascript
复制
data为数据集
...为分组变量,可以是一个也可以是多个,多个的话以逗号分割group_by(mtcars, vs, am)

1.2 summarise语法

代码语言:javascript
复制
data为数据集,如果data被group_by定义分组,则根据分组变量分组计算
...为计算函数,可以是一个也可以是多个,多个的话以逗号分割summarise(data,disp = mean(disp),hp = mean(hp))

summarise计算函数Useful functions拓展
Center: mean(), median()
Spread: sd(), IQR(), mad()
Range: min(), max(), quantile()
Position: first(), last(), nth(),
Count: n(), n_distinct()
Logical: any(), all()

注:计算函数Useful functions拓展中英语不解释了,应该懂得

1.3 group_by和summarise单变量分组计算示例

代码语言:javascript
复制
> library(dplyr) #加载dplyr包
> by_cyl <- group_by(mtcars,cyl) #对mtcars数据集根据cyl变量进行分组注意行5
> by_cyl
# A tibble: 32 x 11
# Groups:   cyl [3]
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# ... with 22 more rows

# 对分组数据的相关变量进行函数计算
> summarise(by_cyl,disp = mean(disp),hp = mean(hp))
# A tibble: 3 x 3
    cyl  disp    hp
  <dbl> <dbl> <dbl>
1     4  105.  82.6
2     6  183. 122. 
3     8  353. 209.


—————分割线:引入%>%管道符号,等价于上方分步骤使用———————————————————————————————————————————————————————————————————————————————————————————————————————————
>library(dplyr) #加载dplyr包
> mtcars %>% group_by(cyl) %>% summarise(disp = mean(disp),hp = mean(hp))
# A tibble: 3 x 3
    cyl  disp    hp
  <dbl> <dbl> <dbl>
1     4  105.  82.6
2     6  183. 122. 
3     8  353. 209.

1.4 group_by和summarise多变量分组计算示例

代码语言:javascript
复制
> mtcars %>% group_by(vs, am) %>% summarise(n = n())
# A tibble: 4 x 3
# Groups:   vs [2]
     vs    am     n
  <dbl> <dbl> <int>
1     0     0    12
2     0     1     6
3     1     0     7
4     1     1     7

2 ddply

接触了Hadley Wickham神包tidyverse以后感觉数据操作那么简单,这里介绍一种可以实现分组计算/操作的方法,就是plyr包的split-apply-combine思想

2.1 ddply语法

代码语言:javascript
复制
ddply(.data, .variables, ... )

.data为数据集
.variables分组变量一定要在“点+括号中”,例如".(sex)或.(group, sex)"
...为计算函数,可以是一个也可以是多个,

2.2 ddply分组计算示例

代码语言:javascript
复制
> library(plyr); library(dplyr)
> dfx <- data.frame(
+   group = c(rep('A', 8), rep('B', 15), rep('C', 6)),
+   sex = sample(c("M", "F"), size = 29, replace = TRUE),
+   age = runif(n = 29, min = 18, max = 54)
+ )
> 
> ddply(dfx, .(group, sex), summarize,
+       mean = round(mean(age), 2),
+       sd = round(sd(age), 2))
  group sex  mean    sd
1     A   F 31.46  8.70
2     A   M 28.49  2.78
3     B   F 28.75  9.19
4     B   M 40.90  8.13
5     C   F 32.24  7.37
6     C   M 40.77 13.22
> 
> 
> ddply(dfx,.(sex), summarize,
+       mean = round(mean(age), 2),
+       sd = round(sd(age), 2))
  sex  mean   sd
1   F 30.46 8.10
2   M 38.68 9.72

注意ddply中分组变量一定要在“点+括号中”,例如".(sex) 或 .(group, sex)"

3 aggregate

3.1 aggregate语法

代码语言:javascript
复制
aggregate(x, by, FUN)x为数据集by为分组变量列表FUN为计算函数

3.2 aggregate分组计算示例

代码语言:javascript
复制
> aggregate(state.x77, list(Region = state.region), mean)
         Region Population   Income Illiteracy Life Exp    Murder  HS Grad    Frost
1     Northeast   5495.111 4570.222   1.000000 71.26444  4.722222 53.96667 132.7778
2         South   4208.125 4011.938   1.737500 69.70625 10.581250 44.34375  64.6250
3 North Central   4803.000 4611.083   0.700000 71.76667  5.275000 54.51667 138.8333
4          West   2915.308 4702.615   1.023077 71.23462  7.215385 62.00000 102.1538
       Area
1  18141.00
2  54605.12
3  62652.00
4 134463.00

————————————————————————————————————————————————————————————————————

> aggregate(state.x77,list(
+           Region = state.region,
+           Cold = state.x77[,"Frost"] > 130),
+           mean)
         Region  Cold Population   Income Illiteracy Life Exp    Murder  HS Grad
1     Northeast FALSE  8802.8000 4780.400  1.1800000 71.12800  5.580000 52.06000
2         South FALSE  4208.1250 4011.938  1.7375000 69.70625 10.581250 44.34375
3 North Central FALSE  7233.8333 4633.333  0.7833333 70.95667  8.283333 53.36667
4          West FALSE  4582.5714 4550.143  1.2571429 71.70000  6.828571 60.11429
5     Northeast  TRUE  1360.5000 4307.500  0.7750000 71.43500  3.650000 56.35000
6 North Central  TRUE  2372.1667 4588.833  0.6166667 72.57667  2.266667 55.66667
7          West  TRUE   970.1667 4880.500  0.7500000 70.69167  7.666667 64.20000
     Frost      Area
1 110.6000  21838.60
2  64.6250  54605.12
3 120.0000  56736.50
4  51.0000  91863.71
5 160.5000  13519.00
6 157.6667  68567.50
7 161.8333 184162.17

3.3 aggregate分组计算补充(formula形式)

代码语言:javascript
复制
aggregate(formula, data, FUN)
#Formulas, one ~ one, one ~ many, many ~ one, and many ~ many:

> aggregate(weight ~ feed, data = chickwts, mean)
       feed   weight
1    casein 323.5833
2 horsebean 160.2000
3   linseed 218.7500
4  meatmeal 276.9091
5   soybean 246.4286
6 sunflower 328.9167
> aggregate(breaks ~ wool + tension, data = warpbreaks, mean)
  wool tension   breaks
1    A       L 44.55556
2    B       L 28.22222
3    A       M 24.00000
4    B       M 28.77778
5    A       H 24.55556
6    B       H 18.77778
> aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean)
  Month    Ozone     Temp
1     5 23.61538 66.73077
2     6 29.44444 78.22222
3     7 59.11538 83.88462
4     8 59.96154 83.96154
5     9 31.44828 76.89655
> aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum)
       alcgp    tobgp ncases ncontrols
1  0-39g/day 0-9g/day      9       261
2      40-79 0-9g/day     34       179
3     80-119 0-9g/day     19        61
4       120+ 0-9g/day     16        24
5  0-39g/day    10-19     10        84
6      40-79    10-19     17        85
7     80-119    10-19     19        49
8       120+    10-19     12        18
9  0-39g/day    20-29      5        42
10     40-79    20-29     15        62
11    80-119    20-29      6        16
12      120+    20-29      7        12
13 0-39g/day      30+      5        28
14     40-79      30+      9        29
15    80-119      30+      7        12
16      120+      30+     10        13

4 splite

感觉splite没有太多好讲的,直接上例子体会一下吧~

代码语言:javascript
复制
> require(stats); require(graphics)
> n <- 10; nn <- 100
> g <- factor(round(n * runif(n * nn)))
> x <- rnorm(n * nn) + sqrt(as.numeric(g))
> 
> xg_group_length <- split(x, g) %>% sapply(length)
> xg_group_length
  0   1   2   3   4   5   6   7   8   9  10 
 42 105 103  93 119 120  80  88  97 101  52 
> xg_group_mean <- split(x, g) %>% sapply(mean)
> xg_group_mean
        0         1         2         3         4         5         6         7 
0.9776091 1.3270451 1.6645178 1.7567653 2.2137027 2.4426637 2.5394288 2.6557613 
        8         9        10 
2.8258368 3.0948452 3.1845892 
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据驱动实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档