2021-09-28-day5-重點(diǎn)是

作業(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ù)

  1. filter 篩選-行

  2. arrange 排序-行

  3. select 篩選-列

  4. mutate 根據(jù)原有列生成新列

  5. summarize 摘要統(tǒng)計(jì)
    行=觀測(cè)纪岁,列=變量

  6. 數(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í)間渊啰?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末探橱,一起剝皮案震驚了整個(gè)濱河市申屹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧膏,老刑警劉巖哗讥,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胞枕,居然都是意外死亡杆煞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門腐泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)决乎,“玉大人,你說(shuō)我怎么就攤上這事派桩」钩希” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵窄坦,是天一觀的道長(zhǎng)唤反。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鸭津,這世上最難降的妖魔是什么彤侍? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮逆趋,結(jié)果婚禮上盏阶,老公的妹妹穿的比我還像新娘。我一直安慰自己闻书,他們只是感情好名斟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魄眉,像睡著了一般砰盐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坑律,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天岩梳,我揣著相機(jī)與錄音,去河邊找鬼晃择。 笑死冀值,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宫屠。 我是一名探鬼主播列疗,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浪蹂!你這毒婦竟也來(lái)了抵栈?” 一聲冷哼從身側(cè)響起告材,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竭讳,沒(méi)想到半個(gè)月后创葡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绢慢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年灿渴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胰舆。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骚露,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缚窿,到底是詐尸還是另有隱情棘幸,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布倦零,位于F島的核電站误续,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扫茅。R本人自食惡果不足惜蹋嵌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葫隙。 院中可真熱鬧栽烂,春花似錦、人聲如沸恋脚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)糟描。三九已至怀喉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間船响,已是汗流浹背磺送。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灿意,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓崇呵,卻偏偏與公主長(zhǎng)得像缤剧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子域慷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容