生信小白菜之关于summarize函数的一切(part 1)

准备包和示例数据

library(dplyr)
library(nycflights13)
library(ggplot2)

summarize()的基本用法

# 获取摘要的函数
# 作用是将数据框折叠成一行
# 举例
summarise(flights,delay=mean(dep_delay,na.rm=T))
# 第二个参数新的一列,也是根据数据框原有数据计算得来
# 返回结果为新的数据框
# na.rm=T 后面解释

summarize()最常使用方式是与group_by联用

# group_by 可以将分析单位从整个数据集更改为单个分组
# 然后在分组后的数据上使用dplyr函数,会自动对应地应用到每个分组上
# 举例
# 按日期分组,得到每日平均延误时间
by_day <- group_by(flights,year,month,day)
summarise(by_day,delay=mean(dep_delay,na.rm=T))
# 这个表内年份都是2013,所以year分组看不出来
# month是从1—12月,每月从1-31号

summarize()group_by组合,构成dplyrR包里面最常用的功能之一:获取分组摘要

关于管道组合 %>%

# 假如你想研究每个目的地的距离和平均延误时间之间的关系
## 先按目的地分类
by_dest <- group_by(flights,dest)
## 进行摘要统计,得到距离平均值、延误时间平均值和航班数量
delay <- summarise(by_dest,
                   count = n(), # 数一数每一种距离对应的航班数量(即行数)
                   dist = mean(distance,na.rm=T),
                   delay= mean(arr_delay,na.rm=T))
## 筛去噪点(航班数量太少的)和去HNL机场(这个距离属于极端值)
delay <- filter(delay,count>20,dest != "HNL" )
## 可视化
ggplot(delay,aes(dist,delay))+
  geom_point(aes(size=count),alpha=1/3)+
  geom_smooth(se=FALSE)

## 这样写代码有个问题:代码在传递过程中会产生后续步骤不再需要的对象名称,而命名本就是一个复杂的事情

## 解决这个问题就需要用到 管道 即 %>% 
## 阅读代码时,%>%可以解读为“然后”
## 这种方法的重点在过程的转换,而不是对象的转换
delay <- flights %>%  # 将flights传递到group_by()的第一个参数
  group_by(dest) %>%  # 然后按dest分组,将分组后的数据框传到summarise()的第一个参数
  summarise(
    count = n(),
    dist=mean(distance,na.rm=T),
    delay= mean(arr_delay,na.rm=T)
  ) %>% 
  filter(count>20,dest != "HNL") # 将摘要信息传递到filter()的一个参数
# 最后赋值给delay

## 管道传递将代码阅读顺序从左到右变为从上到下

## 管道操作是tidyverse包的核心原则之一,不过ggplot2不适用

参数na.rm

# 如果没有这个参数
delay <- flights %>%  
  group_by(dest) %>%  
  summarise(
    count = n(),
    dist=mean(distance),
    delay= mean(arr_delay)
  ) %>% 
  filter(count>20,dest != "HNL")
# 你会发现delay中有非常多NA

# 因为聚合函数遵循缺失值的一般规则是:
# 如果输入数据中有NA,那么输出也是NA
# 这时就要用到na.rm参数,它可以在计算前除去缺失值
# 所有聚合函数都有一个na.rm参数

# 举例
flights %>% 
  group_by(year,month,day) %>% 
  summarise(mean=mean(dep_delay,na.rm=T))
## 在这个示例中,NA表示取消的航班

# 也可以手动预先去掉取消的航班(缺失值)

# 上次提过is.na()判断是否为NA
not_cancelled <- flights %>% 
  filter(!is.na(dep_delay),!is.na(arr_delay)) # 通过!否转是,filter()筛选TRUE值
not_cancelled %>% 
  group_by(year,month,day) %>% 
  summarise(mean=mean(dep_delay))

计数n()

# 聚合操作中有一个函数n()用来计数,或者sum(!is.na())计数非缺失值
# 便于检查,确保自己没有基于非常少的数据得出结论

## 查看具有最长平均延误时间的飞机(按飞机尾号识别)
delays <- not_cancelled %>% 
  group_by(tailnum) %>% 
  summarise(
    delay=mean(arr_delay)
  )
ggplot(delays,aes(delay))+
  geom_freqpoly(binwidth=10)
### 这张图横坐标是每个尾号飞机对应的delay平均时间
### 纵坐标是每个延误时间对应延误次数

## 用散点图看看
delays <- not_cancelled %>% 
  group_by(tailnum) %>% 
  summarise(
    delay=mean(arr_delay),
    n=n()
  )
ggplot(delays,aes(n,delay)) +
  geom_point(alpha=1/10)
## 纵坐标是每个尾号飞机对应的平均delay时间
## 横坐标是对应延误次数

### 可以看出来,当航班量很少时(n在0附近),平均延误时间变动很大
### 随着样本量增大,变动在不断缩小

### 即统计观测时,要时刻警惕那么样本量非常少的分组
### 否则会引入极端值

delays %>% 
  filter(n>25) %>% 
  ggplot(aes(n,delay))+
  geom_point(alpha=1/10)

举例:计算棒球联盟每个球员的打击率

# 获取数据
install.packages("Lahman")
library(Lahman) # 用里面的示例数据 Batting
batting <- as_tibble(Lahman::Batting)

# 打击率=安打数/打数

# 先绘制击球手的能力(打击率ba)与击球机会(打数ab)之间的关系
batters <- batting %>% 
  group_by(playerID) %>% 
  summarize(
    ba=sum(H,na.rm = T)/sum(AB,na.rm = T),
    ab=sum(AB,na.rm = T)
  )
batters %>% 
  filter(ab>100) %>%  # 同样排除过小的数据
  ggplot(aes(ab,ba))+
  geom_point()+
  geom_smooth(se=FALSE)

# 可以看出,能力ba与击球机会数量ab之间存在正相关
# 因为球队会控制击球手的出场,优先选择最好的队员

# 这对球员排名也有重要影响
# 如果使用desc(ba)对球员进行排名,具有最好打击率的不一定是能力最高的
batters %>% 
  arrange(desc(ba))
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值