作業(yè)五-數(shù)據(jù)結(jié)構(gòu)
以小潔的教程為材料學(xué)習(xí)了dplyr包:小潔-生信星球
先使用R studio的markdown進(jìn)行整理芦瘾,最后粘貼到這里
title: "dplyer"
author: "the point is"
date: "2021/9/28"
output: html_document
dplyr核心函數(shù)
filter 篩選-行
arrange 排序-行
select 篩選-列
mutate 根據(jù)原有列生成新列
summarize 摘要統(tǒng)計(jì)
行=觀測(cè)纪岁,列=變量數(shù)據(jù)和R包準(zhǔn)備
library(nycflights13)
library(tidyverse)
1. filter() 篩選-按列給行
按照給定的列的條件,篩選符合的行并輸出
a1=filter(flights,month==1,day==1,dep_time==555)
dim(a1)
運(yùn)算符
比較運(yùn)算符:>,>=,<,<=,==,!=
雙精度浮點(diǎn)數(shù)用near(a,b)代表a==b.
雙精度浮點(diǎn)數(shù):dbl
邏輯運(yùn)算符:
布爾運(yùn)算符:& | 芦缰!蓄坏,與 或 非
復(fù)雜的篩選條件簡(jiǎn)化 %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))#降序
無(wú)論正序倒序价捧,空值排在最后。
如果要將NA排在最前面涡戳,則需要使用
arrange(flights, desc(is.na(dep_time)), dep_time)
3. select() 選定-列
3.1 根據(jù)列名單獨(dú)選擇某幾列
select(flights, year, month, day)
3.2.連選幾列
select(flights, year:day)
3.3連選+反選
select(flights, -(year:day))
3.4.輔助函數(shù)-選擇列名符合以下要求的
輔助函數(shù)自動(dòng)忽略大小寫结蟋,通過(guò)添加`ignore.case = FALSE`進(jìn)行修改
select(flights, starts_with("dep"))
#以dep開頭的
ends_with("xyz")
: 以xyz結(jié)尾的
contains("ijk")
:包含ijk的
matches("(.)\\1")
: 匹配正則表達(dá)式的.??
3.5.重命名
這個(gè)好用,改名時(shí)再也不用把表達(dá)矩陣的所有列名一起改了
rename(flights, tail_num = tailnum)
將tailnum修改為tail_name
3.6.對(duì)列排序渔彰,將某幾列移動(dòng)到開頭嵌屎,everything表示其余各列
select(flights, time_hour, air_time, everything())
4. mutate() 根據(jù)原有列計(jì)算生成新列
mutate()生成新列后,添加新列到數(shù)據(jù)框末尾恍涂;
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 )
新列一旦創(chuàng)建,就可立即使用再沧,也就是可以對(duì)新列進(jìn)行計(jì)算
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
)
以上三個(gè)數(shù)據(jù)框列名如下
colnames(flights_sml)
colnames(flights_sml_1)
colnames(flights_sml_2)
5. summarize() 進(jìn)行分組摘要
以下兩行代碼表示尼夺,將flights根據(jù)year,month和day進(jìn)行分組---365組炒瘸。
然后分別求這365組的dep_delay的平均值淤堵,賦值給delay這一列。
最后一共展示4列什燕,用來(lái)分組的三列粘勒,和根據(jù)分組求的結(jié)果delay這一列。
注意na.rm=T屎即,否則會(huì)返回NA庙睡。
by_month <- group_by(flights, year, month)
summarise(by_month, delay = mean(dep_delay, na.rm = TRUE))
5.1 管道操作
管道符:%>%事富,表示把左邊的結(jié)果拿到右邊做為輸入.
以下四種方式,最終結(jié)果相同:
方式一:
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))
管道連接多行命令時(shí)乘陪,將管道符號(hào)%>%放在上一行末尾统台,與ggplot2時(shí)的+號(hào)一樣。
示例:找出平均延誤時(shí)間最長(zhǎng)的飛機(jī)啡邑。
豈不是用group_by按照飛機(jī)類型分類贱勃,然后summarize計(jì)算延誤時(shí)間的平均值后用arrange對(duì)平均時(shí)間進(jìn)行降序排列。
飛機(jī)類型:carrier(也可用flight或tailnum做條件谤逼,看情況)
到達(dá)延誤:arr_delay>0
策略:因?yàn)橛醒诱`的條件贵扰,所以先篩選延誤時(shí)間大于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
來(lái)移除NA值,否者任何包含NA的計(jì)算的結(jié)果都是NA流部。
5.3 計(jì)數(shù)
關(guān)于count():可以單獨(dú)使用
a=count(flights,carrier)#計(jì)算flights中carrier的分類及個(gè)數(shù)戚绕,返回的與flights一樣的數(shù)據(jù)類型
b=table(flights$carrier)#將flights中的carrier變成因子類型,然后統(tǒng)計(jì)每個(gè)因子的個(gè)數(shù)枝冀,返回的是table的類型
class(a);class(b)
關(guān)于n():只能在函數(shù)內(nèi)部舞丛,聯(lián)系上下文才能使用,n的()內(nèi)不能放東西
carriers <- group_by(flights, carrier)
s1 <- summarise(carriers, n())
mu <- mutate(carriers, n = n())
s3 <- distinct(mu,n)#展示mu中carrier與n不重復(fù)的數(shù)據(jù)
#這里為什么針對(duì)carrier果漾?因?yàn)閏arriers是根據(jù)carrier分類的球切,是一個(gè)帶有carrier分類屬性的數(shù)組,在不指定列的情況下绒障,n()就對(duì)數(shù)據(jù)組的分類屬性列進(jìn)行統(tǒng)計(jì)
s4 <- distinct(mu,carrier,n)
s5 <- distinct(mu,hour,n)#這里展示同一行carrier吨凑,hour、n三者沒(méi)有完全重復(fù)的數(shù)據(jù)户辱。
5.4 按多個(gè)變量分組
這里還需要再理解理解——為什么每次統(tǒng)計(jì)都會(huì)減少一列怀骤?
#先按照年月日分組,也就是按天
daily <- group_by(flights, year, month, day)
(per_day <- summarise(daily, flights = n()))
#再按照月份匯總摘要
(per_month <- summarise(per_day, flights = sum(flights)))
#再按年匯總焕妙,只有一年的數(shù)據(jù)所以成了一行
(per_year <- summarise(per_month, flights = sum(flights)))
5.5 取消分組ungroup
#取消分組,最后相當(dāng)于統(tǒng)計(jì)flights整個(gè)數(shù)據(jù)框中的變量個(gè)數(shù)弓摘,flights在這里是表示展示數(shù)據(jù)是的列名焚鹊,可以修改成任意。
daily%>% ungroup()%>%summarise(flights=n())
6. 分組新變量
6.1 找出每個(gè)分組中最差的成員
選擇每天延誤時(shí)間最長(zhǎng)的10趟航班
分組:365天韧献,所有航班
比較:延誤時(shí)間平均值
篩選:前十
#這里還不知道m(xù)ean怎么過(guò)濾前十
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 找出(數(shù)量)大于某個(gè)閾值的所有分組
最受歡迎的目的地
分組:目的地
比較:次數(shù)(閾值365)
flights%>%group_by(dest)%>%count()%>%filter(n>365)%>%arrange(desc(n))#count()默認(rèn)返回列名“n”
6.3 對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化以計(jì)算分組指標(biāo)
篩選延誤的航班末患,計(jì)算各航班的延誤時(shí)間占目的地總延誤時(shí)間的比例,并顯示指定列锤窑。
延誤:arr_delay>0
各航班的延誤時(shí)間:分組-航班璧针,計(jì)算-總和-延誤時(shí)間>0
目的地總延誤時(shí)間:分組-目的地,計(jì)算-總和-延誤時(shí)間>0
比例:航班時(shí)間/總時(shí)間
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))#怎么計(jì)算航班時(shí)間/總時(shí)間渊啰?