dplyr對(duì)于處理以行列關(guān)系表示的數(shù)據(jù)框(每一行是一個(gè)觀測(cè)值,每一列是一個(gè)維度)十分有效。首先dplyr與SQL語(yǔ)句十分類似,其中select、filter、mutate、summarise等幾個(gè)關(guān)鍵的函數(shù),可以幫助我們非常方便的篩選、修改、匯總數(shù)據(jù)。此外dplyr還可以使我們非常便捷的對(duì)數(shù)據(jù)集進(jìn)行交并合補(bǔ)。最后dplyr中還引入了管道處理的概念(如 1、添加觀測(cè)值、添加變量我們可以使用add_row、add_column函數(shù),添加觀測(cè)值、添加變量。類似于rbind、cbind函數(shù),但這兩個(gè)函數(shù)還可以在原數(shù)據(jù)框的任意位置插入行列。注意這兩個(gè)函數(shù)是根據(jù)tibble類型的數(shù)據(jù)框?qū)崿F(xiàn)的,不支持使用行名;此外add_row會(huì)對(duì)列名進(jìn)行更加嚴(yán)格的檢查,所以需要我們按照列名添加觀測(cè)值。
2、修改行名、列名我們可以使用rename函數(shù),重命名數(shù)據(jù)框中的某個(gè)變量。此外我們還可以使用rename_all、rename_at、rename_if函數(shù),對(duì)所有變量、對(duì)某些變量、對(duì)滿足特定條件的變量進(jìn)行重命名。 為了更好的在普通數(shù)據(jù)框與tibble類型的數(shù)據(jù)框之間轉(zhuǎn)換,我們可以將行名轉(zhuǎn)化為一個(gè)單獨(dú)的變量。使用rownames_to_column、column_to_rownames函數(shù),將行名轉(zhuǎn)化為變量、將變量轉(zhuǎn)化為行名。此外我們還可以使用has_rownames、remove_rownames函數(shù),判斷數(shù)據(jù)框是否有行名、刪除行名。
3、篩選變量我們可以使用select函數(shù),篩選變量、反選(刪除)變量、重命名變量、調(diào)整變量位置。此外我們還可以使用select_all、select_at、select_if函數(shù),對(duì)所有變量、對(duì)某些變量、對(duì)滿足特定條件的變量進(jìn)行篩選。注意篩選變量時(shí)我們既可以使用變量名,也可以使用字符串來(lái)篩選變量;反選變量時(shí)需要使用負(fù)號(hào),此時(shí)相當(dāng)于篩選除了該變量之外的所有變量;我們可以在同一條命令中篩選多次,此時(shí)相當(dāng)于先按照篩選條件的先后順序進(jìn)行篩選,再取篩選結(jié)果的并集,即使某些變量多次被選擇,也只會(huì)在結(jié)果中出現(xiàn)一次。此外我們還可以在篩選語(yǔ)句中使用以下幫助函數(shù)以提高篩選效率。
4、轉(zhuǎn)化變量我們可以使用mutate函數(shù)轉(zhuǎn)化變量,并將新生成的變量添加到數(shù)據(jù)框中,或者直接用新生成的變量替換現(xiàn)有變量。但這種方式既會(huì)保留新生成的變量,也會(huì)保留原有的變量(除非我們使用NULL值來(lái)刪除某個(gè)變量)。如果我們只希望保留新生成的變量,則可以使用transmute函數(shù)。此外我們還可以使用mutate_all、mutate_at、mutate_if函數(shù),對(duì)所有變量、對(duì)某些變量、對(duì)滿足特定條件的變量進(jìn)行轉(zhuǎn)化。注意以上函數(shù)轉(zhuǎn)化變量時(shí),我們使用的函數(shù)需要返回與原始變量長(zhǎng)度一致的變量,否則返回值會(huì)被重復(fù)使用。
4.1、變量轉(zhuǎn)化型函數(shù)我們?cè)谑褂?strong>mutate函數(shù)轉(zhuǎn)化變量時(shí),往往需要用到變量轉(zhuǎn)化型函數(shù)。這樣的函數(shù)往往需要接收一個(gè)(或多個(gè))變量作為參數(shù),并返回一個(gè)與其等長(zhǎng)的新變量。這樣的函數(shù)可以是數(shù)學(xué)運(yùn)算函數(shù)(如+、-、log等)、邏輯運(yùn)算函數(shù)(如&、|、!等)、位運(yùn)算函數(shù)(如bitwAnd、bitwOr等)、字符串處理函數(shù)(如paste、sprintf等)。還可以是dplyr中提供的以下函數(shù):
5、排序觀測(cè)值我們可以使用arrange函數(shù),將數(shù)據(jù)框中的觀測(cè)值按照某一個(gè)或多個(gè)變量的取值大小進(jìn)行排序。這些變量可以是連續(xù)變量,也可以是分類變量,如果變量是由字符構(gòu)成的,則會(huì)按照字符編碼進(jìn)行排序。使用多個(gè)變量排序時(shí),會(huì)先按照第一個(gè)變量的取值進(jìn)行排序,如果取值相同則再按照第二個(gè)變量進(jìn)行排序,依次類推,如果所有變量取值都一致,則保持觀測(cè)值的位置不變。排序時(shí)我們還可以使用desc函數(shù),獲取某個(gè)變量的逆序。
6、篩選觀測(cè)值首先我們可以使用distinct函數(shù),根據(jù)某些變量,或全部變量篩選出不重復(fù)的觀測(cè)值。即使我們只根據(jù)部分變量進(jìn)行去重,也可以保留全部變量,此時(shí)保留的是第一條不重復(fù)的觀測(cè)值。 其次我們可以使用top_n、top_frac函數(shù),根據(jù)某個(gè)變量取值的大小,篩選出排在 前面 的一定數(shù)量或一定比例的觀測(cè)值。這里結(jié)合使用row_number、desc等函數(shù),即可像head、tail函數(shù)一樣,篩選出數(shù)據(jù)框的前n條、后n條值(或者按比例)。此外我們可以使用sample_n、sample_frac函數(shù),隨機(jī)篩選出一定數(shù)量或一定比例的觀測(cè)值。 再次我們還可以使用slice函數(shù),根據(jù)行號(hào)篩選、反選觀測(cè)值。注意此時(shí)我們可以使用 最后我們可以使用filter函數(shù),根據(jù)一個(gè)或多個(gè)邏輯數(shù)組(或生成邏輯數(shù)組的判斷函數(shù))篩選觀測(cè)值。此外我們還可以使用mutate_all、mutate_at、mutate_if函數(shù),對(duì)所有變量、對(duì)某些變量、對(duì)滿足特定條件的變量,按照特定的判斷函數(shù)進(jìn)行篩選。此時(shí)我們除了使用常規(guī)的比較運(yùn)算函數(shù)(如<、>、==等)、邏輯運(yùn)算函數(shù)(如&、|、!等)、數(shù)據(jù)類型判斷函數(shù)(如is.na等)之外,還可以使用between、near函數(shù),來(lái)判斷數(shù)值型變量的取值是否在某個(gè)范圍內(nèi)。
7、匯總觀測(cè)值我們可以使用tally、count函數(shù),查詢數(shù)據(jù)框中有多少條觀測(cè)值。二者的區(qū)別在于:tally常被用于計(jì)算數(shù)據(jù)框整體包含了多少條觀測(cè)值,而count則常被用于計(jì)算某個(gè)變量取特定值時(shí)對(duì)應(yīng)有多少條觀測(cè)值。 我們可以使用summarise函數(shù),對(duì)數(shù)據(jù)框進(jìn)行匯總。此外我們還可以使用summarise_if、summarise_at、summarise_all函數(shù),對(duì)所有變量、對(duì)某些變量、對(duì)滿足特定條件的變量進(jìn)行匯總。注意匯總時(shí)需要使用的函數(shù),往往只需要返回一個(gè)值作為匯總結(jié)果。
7.1、變量匯總型函數(shù)我們?cè)谑褂?strong>summarise函數(shù)匯總變量時(shí),往往需要用到變量匯總型函數(shù)。這樣的函數(shù)往往需要接收一個(gè)(或多個(gè))變量作為參數(shù),并返回一個(gè)單一的值作為匯總結(jié)果。這樣的函數(shù)可以是分位數(shù)計(jì)算函數(shù)(如median、min、max、quantile等)、特征值計(jì)算函數(shù)(如sum、mean、IQR、var、sd、mad等)、邏輯值匯總函數(shù)(如any、all等),還可以是dplyr中提供的以下函數(shù):
8、分組我們可以使用group_by函數(shù),將數(shù)據(jù)框按某些變臉進(jìn)行分組,對(duì)分組之后的數(shù)據(jù)框進(jìn)行的任何操作,都相當(dāng)于先在組內(nèi)進(jìn)行相應(yīng)的操作,然后再依次合并操作結(jié)果。如果需要取消分組,則可以使用ungroup函數(shù)。
9、交并合補(bǔ)我們可以使用bind_rows、bind_cols函數(shù),對(duì)兩個(gè)數(shù)據(jù)框進(jìn)行縱向、橫向合并。類似于rbind、cbind函數(shù),但這兩個(gè)函數(shù)會(huì)對(duì)行列進(jìn)行更加嚴(yán)格的檢查,所以使用bind_rows縱向合并時(shí),可以根據(jù)變量名合并數(shù)據(jù);而使用bind_cols橫向合并時(shí),需要兩個(gè)數(shù)據(jù)框擁有相同數(shù)量的觀測(cè)值。
類似R語(yǔ)言系統(tǒng)函數(shù)中對(duì)數(shù)組進(jìn)行交并合補(bǔ),我們也可以使用union、intersect、setdiff函數(shù),取得兩個(gè)數(shù)據(jù)框的并集、交集、補(bǔ)集。并使用setequal函數(shù)判斷兩個(gè)數(shù)據(jù)框是否相同。此外,如果取并集時(shí)需要包含重復(fù)的觀測(cè)值,則可以使用union_all函數(shù)。
10、數(shù)據(jù)框連接我們可以使用left_join、right_join、inner_join、full_join函數(shù),將兩個(gè)數(shù)據(jù)框按照一個(gè)或多個(gè)變量,進(jìn)行左連接、右連接、內(nèi)連接、外連接。此時(shí)左右兩個(gè)數(shù)據(jù)框用于連接的變量名稱可以相同,也可以不同,我們可以使用by參數(shù)指定使用哪些同名變量進(jìn)行連接,或者左右兩個(gè)數(shù)據(jù)框的哪些變量應(yīng)當(dāng)一一對(duì)應(yīng);除此之外如果還包含其它同名變量,則連接后為了區(qū)分同名變量,默認(rèn)會(huì)給左邊數(shù)據(jù)框中的同名變量添加.x后綴,而給右邊的添加.y后綴,我們可以使用suffix參數(shù)修改這一設(shè)定。 此外我們還可以使用semi_join、anti_join函數(shù),進(jìn)行半連接、反連接。這兩種方式分別與取差集、補(bǔ)集的形式十分類似,但可以通過(guò)數(shù)據(jù)框中的部分變量來(lái)決定差集、補(bǔ)集。
上方的的速記手冊(cè),可以幫助我們快速了解dplyr的整體框架與各項(xiàng)細(xì)節(jié)。獲取更多速記手冊(cè),請(qǐng)前往 這里 。 |
|