生信星球培训第123期

2021-09-28-day5-重点是

2021-09-29  本文已影响0人  重点是
作业五-数据结构

以小洁的教程为材料学习了dplyr包:小洁-生信星球
先使用R studio的markdown进行整理,最后粘贴到这里


title: "dplyer"
author: "the point is"
date: "2021/9/28"
output: html_document


dplyr核心函数

  1. filter 筛选-行

  2. arrange 排序-行

  3. select 筛选-列

  4. mutate 根据原有列生成新列

  5. summarize 摘要统计
    行=观测,列=变量

  6. 数据和R包准备

library(nycflights13)
library(tidyverse)

1. filter() 筛选-按列给行

按照给定的列的条件,筛选符合的行并输出

a1=filter(flights,month==1,day==1,dep_time==555)
dim(a1)

运算符
比较运算符:>,>=,<,<=,==,!=

双精度浮点数用near(a,b)代表a==b.

双精度浮点数:dbl

逻辑运算符:

布尔运算符:& | !,与 或 非

复杂的筛选条件简化 %in%

a2 = filter(flights, month == 11 | month == 12)
a2 = filter(flights, month %in% c(11, 12)) 
#以上两者相同

2. arrange() 排序-按列

arrange(flights, year, month, day)
arrange(flights, desc(month),desc(day))#降序

无论正序倒序,空值排在最后。
如果要将NA排在最前面,则需要使用
arrange(flights, desc(is.na(dep_time)), dep_time)

3. select() 选定-列

3.1 根据列名单独选择某几列
select(flights, year, month, day)

3.2.连选几列
select(flights, year:day)

3.3连选+反选
select(flights, -(year:day))

3.4.辅助函数-选择列名符合以下要求的

辅助函数自动忽略大小写,通过添加`ignore.case = FALSE`进行修改

select(flights, starts_with("dep")) #以dep开头的

ends_with("xyz"): 以xyz结尾的

contains("ijk"):包含ijk的

matches("(.)\\1"): 匹配正则表达式的.??

3.5.重命名

这个好用,改名时再也不用把表达矩阵的所有列名一起改了

rename(flights, tail_num = tailnum)
将tailnum修改为tail_name

3.6.对列排序,将某几列移动到开头,everything表示其余各列

select(flights, time_hour, air_time, everything())

4. mutate() 根据原有列计算生成新列

mutate()生成新列后,添加新列到数据框末尾;

transmute()只保留新生成的列。

  flights_sml <- select(flights, 
        year:day, 
        ends_with("delay"), 
        distance, 
        air_time  )
  flights_sml_1 = mutate(flights_sml,
            gain = dep_delay - arr_delay,
            speed = distance / air_time * 60   )

新列一旦创建,就可立即使用,也就是可以对新列进行计算

  mutate(flights_sml,
    gain = dep_delay - arr_delay,
    hours = air_time / 60,
    gain_per_hour = gain / hours
  )

transmute()只保留新列

  flights_sml_2 =  transmute(flights,
    gain = dep_delay - arr_delay,
    hours = air_time / 60,
    gain_per_hour = gain / hours
  )

以上三个数据框列名如下

colnames(flights_sml)
colnames(flights_sml_1)
colnames(flights_sml_2)

5. summarize() 进行分组摘要

以下两行代码表示,将flights根据year,month和day进行分组---365组。

然后分别求这365组的dep_delay的平均值,赋值给delay这一列。

最后一共展示4列,用来分组的三列,和根据分组求的结果delay这一列。

注意na.rm=T,否则会返回NA。

by_month <- group_by(flights, year, month)
summarise(by_month, delay = mean(dep_delay, na.rm = TRUE))

5.1 管道操作

管道符:%>%,表示把左边的结果拿到右边做为输入.

以下四种方式,最终结果相同:

方式一:
by_month <- group_by(flights, year, month)
summarise(by_month, delay = mean(dep_delay, na.rm = TRUE))
方式二:
summarise(group_by(flights, year, month),delay = mean(dep_delay, na.rm = TRUE))
方式三:
group_by(flights, year, month) %>% summarise(delay = mean(dep_delay, na.rm = TRUE))
方式四:
flight %>% group_by(year, month) %>% summarise(delay = mean(dep_delay, na.rm = TRUE))

管道连接多行命令时,将管道符号%>%放在上一行末尾,与ggplot2时的+号一样。

示例:找出平均延误时间最长的飞机。

岂不是用group_by按照飞机类型分类,然后summarize计算延误时间的平均值后用arrange对平均时间进行降序排列。

飞机类型:carrier(也可用flight或tailnum做条件,看情况)

到达延误:arr_delay>0

策略:因为有延误的条件,所以先筛选延误时间大于0的行

flights %>% filter(dep_delay>0) %>% 
group_by(carrier) %>% summarise(mean_dep= mean(dep_delay,na.rm=T))%>% arrange(desc(mean_dep))

5.2 缺失值(NA)

使用na.rm = TRUE来移除NA值,否者任何包含NA的计算的结果都是NA。
5.3 计数

关于count():可以单独使用

a=count(flights,carrier)#计算flights中carrier的分类及个数,返回的与flights一样的数据类型
b=table(flights$carrier)#将flights中的carrier变成因子类型,然后统计每个因子的个数,返回的是table的类型
class(a);class(b)

关于n():只能在函数内部,联系上下文才能使用,n的()内不能放东西

carriers <- group_by(flights, carrier)
s1 <- summarise(carriers, n())
mu <- mutate(carriers, n = n())
  s3 <- distinct(mu,n)#展示mu中carrier与n不重复的数据
#这里为什么针对carrier?因为carriers是根据carrier分类的,是一个带有carrier分类属性的数组,在不指定列的情况下,n()就对数据组的分类属性列进行统计
  s4 <- distinct(mu,carrier,n)
  s5 <- distinct(mu,hour,n)#这里展示同一行carrier,hour、n三者没有完全重复的数据。

5.4 按多个变量分组

这里还需要再理解理解——为什么每次统计都会减少一列?

#先按照年月日分组,也就是按天
daily <- group_by(flights, year, month, day)
(per_day   <- summarise(daily, flights = n()))
#再按照月份汇总摘要
(per_month <- summarise(per_day, flights = sum(flights)))
#再按年汇总,只有一年的数据所以成了一行
(per_year  <- summarise(per_month, flights = sum(flights)))

5.5 取消分组ungroup

#取消分组,最后相当于统计flights整个数据框中的变量个数,flights在这里是表示展示数据是的列名,可以修改成任意。
daily%>% ungroup()%>%summarise(flights=n())

6. 分组新变量

6.1 找出每个分组中最差的成员

选择每天延误时间最长的10趟航班

分组:365天,所有航班

比较:延误时间平均值

筛选:前十

#这里还不知道mean怎么过滤前十
fli_delay <- flights%>%group_by(day,flight)%>%summarise(delay_mean=mean(arr_delay,na.rm=T))%>%arrange(desc(delay_mean))%>%filter(delay_mean>361)

6.2 找出(数量)大于某个阈值的所有分组

最受欢迎的目的地

分组:目的地

比较:次数(阈值365)

flights%>%group_by(dest)%>%count()%>%filter(n>365)%>%arrange(desc(n))#count()默认返回列名“n”

6.3 对数据进行标准化以计算分组指标

筛选延误的航班,计算各航班的延误时间占目的地总延误时间的比例,并显示指定列。

延误:arr_delay>0

各航班的延误时间:分组-航班,计算-总和-延误时间>0

目的地总延误时间:分组-目的地,计算-总和-延误时间>0

比例:航班时间/总时间

tmp <- select(flights,flight,arr_delay,dest)
tmp <- filter(tmp,arr_delay>0)
  #或管道符:
  #tmp1 <- flights%>% select(flight,arr_delay,dest)%>% filter(arr_delay>0)
flight_delay <- tmp%>%group_by(flight)%>%summarise(f_delay=sum(arr_delay,na.rm=T))
dest_delay <- tmp%>%group_by(dest)%>%summarise(d_delay=sum(arr_delay,na.rm=T))#怎么计算航班时间/总时间?
上一篇下一篇

猜你喜欢

热点阅读