2021-09-28-day5-重点是

作业五-数据结构

以小洁的教程为材料学习了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))#怎么计算航班时间/总时间?
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容