第三章 使用dplyr進(jìn)行數(shù)據(jù)轉(zhuǎn)換

加載 tidyverse 時边篮,仔細(xì)查看輸出的沖突信息揭厚,它會告訴你 dplyr 覆蓋了基礎(chǔ) R 包中的哪些函數(shù)李剖。如果想要在加載 dplyr 后使用這些函數(shù)的基礎(chǔ)版本示绊,那么你應(yīng)該使用它們的完整名稱: stats::filter() 和 stats::lag()锭部。
? int 表示整數(shù)型變量。
? dbl 表示雙精度浮點數(shù)型變量面褐,或稱實數(shù)拌禾。
? chr 表示字符向量,或稱字符串展哭。
? dttm 表示日期時間(日期 + 時間)型變量湃窍。
? lgl 表示邏輯型變量,是一個僅包括 TRUE 和 FALSE 的向量匪傍。
? fctr 表示因子您市, R 用其來表示具有固定數(shù)目的值的分類變量。
? date 表示日期型變量役衡。
dplyr基礎(chǔ)
5 個 dplyr 核心函數(shù):
? 按值篩選觀測(filter())茵休。
? 對行進(jìn)行重新排序(arrange())。
? 按名稱選取變量(select())手蝎。
? 使用現(xiàn)有變量的函數(shù)創(chuàng)建新變量(mutate())榕莺。
? 將多個值總結(jié)為一個摘要統(tǒng)計量(summarize())。
5 個函數(shù)的工作方式都是相同的:
(1) 第一個參數(shù)是一個數(shù)據(jù)框棵介。
(2) 隨后的參數(shù)使用變量名稱(不帶引號)描述了在數(shù)據(jù)框上進(jìn)行的操作钉鸯。
(3) 輸出結(jié)果是一個新數(shù)據(jù)框。
這些函數(shù)都可以和 group_by() 函數(shù)聯(lián)合起來使用邮辽, group_by() 函數(shù)可以改變以上每個函數(shù)的作用范圍唠雕,讓其從在整個數(shù)據(jù)集上操作變?yōu)樵诿總€分組上分別操作贸营。
使用filter()篩選行
filter() 函數(shù)可以基于觀測的值篩選出一個觀測子集。第一個參數(shù)是數(shù)據(jù)框名稱及塘,第二個參數(shù)以及隨后的參數(shù)是用來篩選數(shù)據(jù)框的表達(dá)式莽使。


比較運算符
比較運算符: >、 >=笙僚、 <芳肌、 <=、 !=(不等于)和 ==(等于)肋层。
比較浮點數(shù)是否相等時亿笤,不能使用 ==,而應(yīng)該使用 near():


邏輯運算符
布爾運算符: & 表示“與”栋猖、 | 表示“或”净薛、 ! 表示“非”:



缺失值
確定一個值是否為缺失值,可以使用 is.na() 函數(shù):


filter() 只能篩選出條件為 TRUE 的行蒲拉;它會排除那些條件為 FALSE 和 NA 的行:


使用arrange()排列行
arrange() 函數(shù)的工作方式與 filter() 函數(shù)非常相似肃拜,但前者不是選擇行,而是改變行的順序雌团。它接受一個數(shù)據(jù)框和一組作為排序依據(jù)的列名(或者更復(fù)雜的表達(dá)式)作為參數(shù)燃领。如果列名不只一個,那么就使用后面的列在前面排序的基礎(chǔ)上繼續(xù)排序锦援,注:默認(rèn)缺失值排在最后猛蔽。


使用 desc() 可以按列進(jìn)行降序排序:


使用select()選擇列
select()可以用于選擇自己需要的列作為子集,然后用于分析:




select () 函數(shù)的一些輔助函數(shù):
? starts_with("abc"):匹配以“abc”開頭的名稱灵寺。
? ends_with("xyz"):匹配以“xyz”結(jié)尾的名稱曼库。
? contains("ijk"):匹配包含“ijk”的名稱。
? matches("(.)\1"):選擇匹配正則表達(dá)式的那些變量略板。這個正則表達(dá)式會匹配名稱中有
重復(fù)字符的變量毁枯。你將在第 10 章中學(xué)習(xí)到更多關(guān)于正則表達(dá)式的知識。
? num_range("x", 1:3):匹配 x1叮称、 x2 和 x3后众。
select() 可以重命名變量,但我們很少這樣使用它颅拦,因為這樣會丟掉所有未明確提及的變量蒂誉。我們應(yīng)該使用 select() 函數(shù)的變體 rename() 函數(shù)來重命名變量,以保留所有未明確提及的變量:


select() 函數(shù)和 everything() 輔助函數(shù)結(jié)合起來使用距帅∮蚁牵可以將幾個變量移到數(shù)據(jù)框開頭時,這種用法非常奏效:


使用mutate()添加新變量
mutate()函數(shù)可用于添加新的列碌秸。
.after = X 添加在X列的后面 .before = Y 添加在Y列的前面


如果只想保留新變量绍移,可以使用 transmute() 函數(shù):


常用創(chuàng)建函數(shù)
算術(shù)運算符: +悄窃、 -、 *蹂窖、 /轧抗、 ^


模運算符: %/% 和 %%


對數(shù)函數(shù): log()碘耳、 log2() 和 log10()
偏移函數(shù):lead() 和 lag() 函數(shù)可以返回一個序列的領(lǐng)先值和滯后值扔茅。


累加和滾動聚合:R 提供了計算累加和物喷、累加積剃盾、累加最小值和累加最大值的函數(shù): cumsum()、 cumprod()郑临、commin() 和 cummax()颜骤; dplyr 還提供了 cummean() 函數(shù)以計算累加均值聂渊。如果想要計算滾動聚合(即滾動窗口求和)孝宗,那么可以嘗試使用 RcppRoll 包:


邏輯比較: <穷躁、 <=、 >因妇、 >= 和 !=


使用summarize()進(jìn)行分組摘要
查看數(shù)據(jù)摘要问潭。
使用管道組合多種操作
管道命令: %>%,使用這種方法時婚被, x %>% f(y) 會轉(zhuǎn)換為 f(x, y)睦授, x %>% f(y) %>% g(z) 會轉(zhuǎn)換為 g(f(x,y), z),以此類推摔寨。



等價于

缺失值
na.rm = TRUE表示移除缺失值。


計數(shù)
n()函數(shù)表示計數(shù)怖辆。
常用的摘要函數(shù)
位置度量:median(x)中位值
分散程度度量: sd(x)是复、 IQR(x) 和 mad(x)。均方誤差(又稱標(biāo)準(zhǔn)誤差竖螃, standard deviation淑廊, sd)是分散程度的標(biāo)準(zhǔn)度量方式。四分位距 IQR() 和絕對中位差 mad(x) 基本等價特咆。
秩的度量: min(x)季惩、 quantile(x, 0.25) 和 max(x)。quantile(x, 0.25) 會找出 x 中按從小到大順序大于前25% 而小于后 75% 的值腻格。
定位度量: first(x)画拾、 nth(x, 2) 和 last(x)。這幾個函數(shù)的作用與 x[1]菜职、 x[2] 和 x[length(x)] 相同青抛,只是當(dāng)定位不存在時(比如嘗試從只有兩個元素的分組中得到第三個元素),前者允許你設(shè)置一個默認(rèn)值酬核。
計數(shù):n(),sum(!is.na(x))可以計算出非缺失值的數(shù)量蜜另,n_distinct(x)可以計算出唯一值的數(shù)量适室。
邏輯值的計數(shù)和比例: sum(x > 10) 和 mean(y == 0)。當(dāng)與數(shù)值型函數(shù)一同使用時举瑰, TRUE 會轉(zhuǎn)換為 1捣辆, FALSE 會轉(zhuǎn)換為 0。
按多個變量分組
當(dāng)使用多個變量進(jìn)行分組時此迅,每次的摘要統(tǒng)計會用掉一個分組變量汽畴。



取消分組
如果想要取消分組,并回到未分組的數(shù)據(jù)繼續(xù)操作邮屁,那么可以使用 ungroup() 函數(shù):


分組新變量(和篩選器)
分組篩選器的作用相當(dāng)于分組新變量加上未分組篩選器整袁。


附:dplry深度學(xué)習(xí)
篩選:filter
filter()函數(shù)k可以按照給定的邏輯條件篩選出符合要求的子數(shù)據(jù)集,返回與輸入數(shù)據(jù)相同的數(shù)據(jù)類型佑吝,支持對同一對象的任意條件組合坐昙。
語法:
filter(data,條件)





排序:arrange
arrange()函數(shù)按照給定的列對數(shù)據(jù)進(jìn)行排序,默認(rèn)是按照升序排序芋忿,也可以使用desc()實現(xiàn)降序排序炸客。可以對多個列進(jìn)行排序戈钢,用逗號分隔痹仙。
語法:
arrange(data,col_name)



選擇:select
select()按照列名選擇子數(shù)據(jù)集,可以結(jié)合特定函數(shù)使用:
ends_with():選擇以指定字符結(jié)尾的列
starts_with():選擇以指定字符開頭的列
contains():選擇包含指定字符的列
one_of():選擇列名為指定字符的列
num_range():選擇組合字符指定的列
everything():選擇所有的列殉了,一般不用于選擇开仰,而是用于修改列的順序
語法:
select(data,col_names)







重命名:rename
rename()函數(shù)的使用方法和select一樣,唯一不同的是rename()函數(shù)可以對列進(jìn)行重命名后返回的是全部列薪铜,而不是只返回重命名的列众弓。
語法:
rename(data,new_name=old_name)


變形:mutate
mutate()函數(shù)可以對已有的列進(jìn)行數(shù)據(jù)運算并添加為新的列,mutate的結(jié)果會保留原有變量隔箍。
語法:
mutate(data,…)


去重:distinct
distinct()用于對輸入的數(shù)據(jù)進(jìn)行去重谓娃,返回?zé)o重復(fù)的行。
語法:
distinct(.data, ..., .keep_all = FALSE)



概要:summarise
sunmmarise()可以對數(shù)據(jù)框進(jìn)行匯總操作蜒滩,返回一維結(jié)果滨达。
語法:
summarise(.data, ...)
summarise主要支持以下幾種公式 :
mean()、 median()
sd()俯艰、 IQR()捡遍、 mad()
min()、 max()竹握、 quantile()
first()稽莉、 last()、 nth()
n()、 n_distinct()
any()污秆、 all()


抽樣:sample
用于對數(shù)據(jù)進(jìn)行抽樣的函數(shù)劈猪,sample_n()抽取指定數(shù)量的樣本,sample_frac()抽取指定百分比的樣本良拼,默認(rèn)為不放回抽樣战得,可以通過設(shè)置replacement=TRUE改為放回抽樣。
語法:
sample_n(tbl, size, replace = FALSE, weight = NULL, .env = parent.frame())
sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,.env = parent.frame())








分組:group_by
group_by()用于對數(shù)據(jù)集按照給定變量分組庸推,返回分組后的數(shù)據(jù)集常侦,使用以上的函數(shù)對分組數(shù)據(jù)進(jìn)行操作時,會自動對分組數(shù)據(jù)進(jìn)行操作贬媒。
語法:
group_by(data, ..., add = FALSE)










條件語句:ifelse
語法:
if_else(condition,true, false, missing = NULL)



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聋亡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子际乘,更是在濱河造成了極大的恐慌坡倔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖含,死亡現(xiàn)場離奇詭異罪塔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)养葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門征堪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关拒,你說我怎么就攤上這事佃蚜。” “怎么了着绊?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵谐算,是天一觀的道長。 經(jīng)常有香客問我畔柔,道長,這世上最難降的妖魔是什么臣樱? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任靶擦,我火速辦了婚禮,結(jié)果婚禮上雇毫,老公的妹妹穿的比我還像新娘玄捕。我一直安慰自己,他們只是感情好棚放,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布枚粘。 她就那樣靜靜地躺著,像睡著了一般飘蚯。 火紅的嫁衣襯著肌膚如雪馍迄。 梳的紋絲不亂的頭發(fā)上福也,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音攀圈,去河邊找鬼暴凑。 笑死,一個胖子當(dāng)著我的面吹牛赘来,可吹牛的內(nèi)容都是我干的现喳。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼犬辰,長吁一口氣:“原來是場噩夢啊……” “哼嗦篱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幌缝,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤灸促,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狮腿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腿宰,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年缘厢,在試婚紗的時候發(fā)現(xiàn)自己被綠了吃度。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡贴硫,死狀恐怖椿每,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情英遭,我是刑警寧澤间护,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站挖诸,受9級特大地震影響汁尺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜多律,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一痴突、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狼荞,春花似錦辽装、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春拓巧,著一層夾襖步出監(jiān)牢的瞬間斯碌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工玲销, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留输拇,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓贤斜,卻偏偏與公主長得像策吠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘩绒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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