2021-09-28-day5-重点是
作业五-数据结构
以小洁的教程为材料学习了dplyr包:小洁-生信星球
先使用R studio的markdown进行整理,最后粘贴到这里
title: "dplyer"
author: "the point is"
date: "2021/9/28"
output: html_document
dplyr核心函数
-
filter 筛选-行
-
arrange 排序-行
-
select 筛选-列
-
mutate 根据原有列生成新列
-
summarize 摘要统计
行=观测,列=变量 -
数据和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))#怎么计算航班时间/总时间?