R語言dplyr包學習筆記(吐血整理宇宙無敵詳細版) - CDA數據分析師

2020-12-27 CDA數據分析師

出處:AI入門學習

dplyr包主要用於數據清洗和整理,主要功能有:行選擇、列選擇、統計匯總、窗口函數、數據框交集等是非常高效、友好的數據處理包,學清楚了,基本上數據能隨意玩弄,對的,隨意玩弄,簡直大大提高數據處理及分析效率。我以為,該包是數據分析必學包之一。學習過程需要大量試驗,領悟其中設計的精妙之處。歡迎交流

#包安裝與加載

install.packages("dplyr")

library(dplyr)

#調用mtcars數據&數據集介紹

data(mtcars)

str(mtcars)

本文案例使用數據集 mtcars 具體結構如下,直接加載即可共11個欄位,32條數據,每個欄位的含義如下:mpg-百公裡油耗;cyl-氣缸數;disp-排量;hp-馬力;drat-軸距;wt-重量; qsec-百公裡時間 ;vs-發動機類型

按行篩選: filter()

按給定的邏輯判斷篩選出符合要求的子數據集, 類似於 subset() 函數

filter(mtcars, mpg>=22)

filter(mtcars, cyl == 4 | gear == 3)

filter(mtcars, cyl == 4 & gear == 3)

注意: 表示 AND 時要使用 & 而避免 &&

按列篩選:select

select()用列名作參數來選擇子數據集。dplyr包中提供了些特殊功能的函數與select函數結合使用,用於篩選變量,包括starts_with,ends_with,contains,matches,one_of,num_range和everything等。用於重命名時,select()只保留參數中給定的列,rename()保留所有的列,只對給定的列重新命名。原數據集行名稱會被過濾掉。

data(iris)

iris = tbl_df(iris)

#選取變量名前綴包含Petal的列

select(iris, starts_with("Petal"))

#選取變量名前綴不包含Petal的列

select(iris, -starts_with("Petal"))

#選取變量名後綴包含Width的列

select(iris, ends_with("Width"))

#選取變量名後綴不包含Width的列

select(iris, -ends_with("Width"))

#選取變量名中包含etal的列

select(iris, contains("etal"))

#選取變量名中不包含etal的列

select(iris, -contains("etal"))

#正則表達式匹配,返回變量名中包含t的列

select(iris, matches(".t."))

#正則表達式匹配,返回變量名中不包含t的列

select(iris, -matches(".t."))

#直接選取列

select(iris, Petal.Length, Petal.Width)

#返回除Petal.Length和Petal.Width之外的所有列

select(iris, -Petal.Length, -Petal.Width)

#使用冒號連接列名,選擇多個列

select(iris, Sepal.Length:Petal.Width)

#選擇字符向量中的列,select中不能直接使用字符向量篩選,需要使用one_of函數

vars <- c("Petal.Length", "Petal.Width")

select(iris, one_of(vars))

#返回指定字符向量之外的列

select(iris, -one_of(vars))

#返回所有列,一般調整數據集中變量順序時使用

select(iris, everything())

#調整列順序,把Species列放到最前面

select(iris, Species, everything())

神奇變形函數:mutate()transmute()

mutate()和transmute()函數對已有列進行數據運算並添加為新列,類似於transform() 函數,不同的是可以在同一語句中對剛增添加的列進行操作,mutate()返回的結果集會保留原有變量,transmute()只返回擴展的新變量,原數據集行名稱會被過濾掉

1、mutate變量變形

1.1 單個變量操作:mutate可以對數據框中已有的變量進行操作或者增加變量,值得稱讚的是,一段mutate的代碼中,靠後的變量操作可以操作前期新添加或改變的變量,這是transform所不具備的特性。

1.1.1新增列

mtcars%>% mutate(cyl2 = cyl * 2,cyl4 = cyl2 * 2)

1.1.2刪除列

mtcars %>% mutate(mpg = NULL,disp = disp * 0.0163871)

mtcars %>% mutate(cyl = NULL)

不需要的列不在了

1.1.3窗口函數應用

mtcars %>% group_by(cyl) %>% mutate(rank = min_rank(desc(mpg)))

mtcars %>% group_by(cyl) %>% mutate(mpg_max = max(mpg))

原來的明細還保留,同時每個分組的統計值算出來了,是不是很方便

1.2 批量操作

同時若你嫌麻煩一個個地對變量進行操作,還可以使用mutate_each函數對數據框中的變量批量操作,通過調整funs(即functions)和vars(variables)參數控制functions的數量,以及參與變形的variables,這裡控制variables的技巧與select函數相似。

#對每個變量進行排名

mtcars%>%mutate_each(funs(dense_rank))

mpg cyl disp hp drat wt qsec vs am gear carb

1 16 2 13 11 16 9 6 1 2 2 4

2 16 2 13 11 16 12 10 1 2 2 4

3 19 1 6 6 15 7 22 2 2 2 1

4 17 2 16 11 5 16 24 2 1 1 1

5 13 3 23 15 6 18 10 1 1 1 2

#對disp的變量進行排名

mtcars%>%mutate_each(funs(dense_rank,min_rank),disp)

mpg cyl disp hp drat wt qsec vs am gear carb dense_rank min_rank

1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 13 13

2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 13 13

3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 6 6

4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 16 18

5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 23 27

6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 15 17

7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 23 27

#對除了disp的變量進行排名

mtcars%>%mutate_each(funs(dense_rank,min_rank),-disp)

2、transmute

返回值中不包含原數據集變量,只保留計算轉換後的變量。

mtcars%>%mutate(wt_log=log(wt))

mtcars%>%transmute(wt_log=log(wt))

mtcars %>%mutate(displ_l = disp / 61.0237)

mtcars %>%transmute(displ_l = disp / 61.0237)

排名函數 :ranking

row_number 通用排名,並列的名次結果按先後順序不一樣,靠前出現的元素排名在前

min_rank 通用排名,並列的名次結果一樣,佔用下一名次。

dense_rank 中國式排名,並列排名不佔用名次,如:無論有幾個並列第2名,之後的排名仍應該是第3名

percent_rank 按百分比的排名

cume_dist 累計分布區間的排名

ntile 粗略地把向量按堆排名,n即是堆的數量

x = c(5, 1, 3, 2, 2, NA)

row_number(x)

min_rank(x)

dense_rank(x)

percent_rank(x)

cume_dist(x)

ntile(x, 2)

mtcars%>%mutate(dense_rank=cume_dist(cyl))

排序函數: arrange()

注意,排序與排名的區別,結合rank函數理解

按給定的列名依次對行進行排序.

arrange(mtcars, mpg)

arrange(mtcars, mpg,disp)

對列名加 desc() 進行倒序 或者負數:

arrange(mtcars, desc(mpg))

arrange(mtcars, -mpg)

去重函數:distinct

distinct()用於對輸入的tbl進行去重,返回無重複的行,類似於 base::unique() 函數,但是處理速度更快。原數據集行名稱會被過濾掉。

#

df <- data.frame( x = sample(10, 100, rep = TRUE),

y = sample(10, 100, rep = TRUE) )

#以全部兩個變量去重,返回去重後的行數

nrow(distinct(df))

nrow(distinct(df, x, y))

#以變量x去重,只返回去重後的x值

distinct(df, x)

#以變量y去重,只返回去重後的y值

distinct(df, y)

#以變量x去重,返回所有變量

distinct(df, x, .keep_all = TRUE)

#以變量y去重,返回所有變量

distinct(df, y, .keep_all = TRUE)

#對變量運算後的結果去重

distinct(df, diff = abs(x - y))

匯總函數:summarise

1、直接匯總

#返回數據框中變量disp的均值

summarise(mtcars, mean(disp))

#返回數據框中變量disp的標準差

summarise(mtcars, sd(disp))

#返回數據框中變量disp的最大值及最小值

summarise(mtcars, max(disp), min(disp))

#返回數據框mtcars的行數

summarise(mtcars, n())

#返回unique的gear數

summarise(mtcars, n_distinct(gear))

#返回disp的第一個值

summarise(mtcars, first(disp))

#返回disp的最後個值

summarise(mtcars, last(disp))

2、分組統計

# 按變量cyl分組,求disp的均值和個數

mtcars %>%group_by(cyl) %>%

summarise(mean = mean(disp), n = n())

# 按變量cyl, vs分組,求每個組的記錄數

mtcars %>%

group_by(cyl, vs) %>%

summarise(cyl_n = n()) %>%

group_vars()

# 按變量cyl分組,求disp的均值和標準差

group_by(cyl) %>%

summarise(disp = mean(disp), sd = sd(disp))

數據匹配函數:join 系列

#數據框中經常需要將多個表進行連接操作, 如左連接、右連接、內連接等,dplyr包也提供了數據集的連接操作,

#類似於 base::merge() 函數。語法如下:

#內連接,合併數據僅保留匹配的記錄

inner_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#左連接,向數據集x中加入匹配的數據集y記錄

left_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#右連接,向數據集y中加入匹配的數據集x記錄

right_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#全連接,合併數據保留所有記錄,所有行

full_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#返回能夠與y表匹配的x表所有記錄

semi_join(x,y, by = NULL, copy = FALSE, ...)

#返回無法與y表匹配的x表的所有記錄

anti_join(x, y, by = NULL, copy = FALSE, ...)

df1 = data.frame(CustomerId=c(1:6), sex = c("f", "m", "f", "f", "m", "m"), Product=c(rep("Toaster",3), rep("Radio",3)))

df2 = data.frame(CustomerId=c(2,4,6,7),sex = c( "m", "f", "m", "f"), State=c(rep("Alabama",3), rep("Ohio",1)))

#內連接,默認使用"CustomerId"和"sex"連接

inner_join(df1, df2)

#左連接,默認使用"CustomerId"和"sex"連接

left_join(df1, df2)

#右連接,默認使用"CustomerId"和"sex"連接

right_join(df1, df2)

#全連接,默認使用"CustomerId"和"sex"連接

full_join(df1, df2)

#內連接,使用"CustomerId"連接,同名欄位sex會自動添加後綴

inner_join(df1, df2, by = c("CustomerId" = "CustomerId"))

#以CustomerId連接,返回df1中與df2匹配的記錄

semi_join(df1, df2, by = c("CustomerId" = "CustomerId"))

#以CustomerId和sex連接,返回df1中與df2不匹配的記錄

anti_join(df1, df2)

集合操作函數: set

dplyr也提供了集合操作函數,實際上是對base包中的集合操作的重寫,但是對數據框和其它表格形式的數據操作更加高效。語法如下:

#取兩個集合的交集

intersect(x,y, ...)

#取兩個集合的併集,並進行去重

union(x,y, ...)

#取兩個集合的併集,不去重

union_all(x,y, ...)

#取兩個集合的差集

setdiff(x,y, ...)

#判斷兩個集合是否相等

setequal(x, y, ...)

mtcars$model <- rownames(mtcars)

first <- mtcars[1:20, ]

second <- mtcars[10:32, ]

intersect(first, second)

#取兩個集合的併集,並去重

union(first, second)

#取兩個集合的差集,返回first中存在但second中不存在的記錄

setdiff(first, second)

#取兩個集合的交集,返回second中存在但first中不存在的記錄

setdiff(second, first)

#取兩個集合的交集, 不去重

union_all(first, second)

#判斷兩個集合是否相等,返回TRUE

setequal(mtcars, mtcars[32:1, ])

匯總函數:tally系列

tally是一個很方便的計數函數,其根據最初的調用而決定下一次調用n或者sum(n)。它還有其他的小夥伴比如count和n,都是計數家族的。

iris%>%group_by(Species)%>%tally

抽樣函數:sample系列

此sample系列是對數據框進行隨機抽樣,只作用於數據框和dplyr自帶的tbl等格式的數據。sample_n為按行數隨機抽樣,而sample_frac為按比例抽樣;其weight參數可以設置抽樣的權重而replace參數為有放回抽樣。

sample_n(mtcars,2,replace=TRUE)

sample_n(mtcars,2,weight=mpg/mean(mpg))

sample_frac(mtcars,0.1)

sample_frac(mtcars,0.1,weight=1/mpg)

相關焦點

  • R包中的小李飛刀|data.table入門介紹
    在一項基準測試中,對50GB數據進行同樣的數據處理,data.table用了15分鐘,dplyr用了51分鐘,pandas用了31分鐘,data.table包完勝。眾多R包為了提升性能都紛紛調用data.table包。在這個大數據的時代,如果你想用R來做大數據分析,data.table包是你不可錯過的超高性能數據整理的技能包!
  • R語言集成開發環境 RStudio中的函數和包!
    作者:丁點helper來源:丁點幫你通過之前的文章,大家已經了解到,用R語言集成開發環境 RStudio進行數據整理和統計分析,其實是一個讀取、處理、保存對象的過程。今天我們要學習的就是RStudio是如何讀取、處理和保存對象的。R中的函數說到函數,大家最先想到的可能是:Y=X+3 這樣的一元一次函數,這個函數會幫我們生成 X+3 的結果,其功能是求和。
  • R語言數據實戰 | R中的數據類型
    通常,時間類數據是以字符串形式輸入到R中的,因此首先需要把這些字符轉換成R可以識別的時間類型數據。R語言的基礎包中提供了兩種類型:一類是Date日期數據,它不包括時間和時區信息;另一類是POSIXct/POSIXlt類型數據,其中包括了日期、時間和時區信息。下面我就分別介紹這兩類數據如何從字符切換過來以及後續可進行的操作。1)如何把字符轉化成Date日期格式?
  • R語言數據科學工具包:creditmodel-1.3版本發布
    2 開源creditmodel包的動機和意義creditmodel是一個免費開源的R語言數據科學工具包,旨在幫助沒有數據科學背景的人能夠在短時間內完成建模和數據分析工作,讓他們更多地關注業務問題本身,並將更多的時間分配給制定決策。
  • 是R的圖
    >library(dplyr) #數據轉換包library(tidyr) #數據轉換包library(splines) #數據差值包ggplot2的基本概念數據data/映射美學asethetics/幾何對象geometries/分面facets/統計statistics/坐標系coordinates/主題themes數據準備set.seed(123
  • 梳理一下數據分析師的全景職業規劃
    還文末分享了幾本經典統計學書籍的pdf版,有需要可自取。想寫這個文章,是對我所見所聞的梳理,作為一個有不少粉絲的數據分析從業者,我接觸了一般人可能感受不到的一些事情,比如每天面臨粉絲很多五花八門的問題,每天要回答很多人一樣的問題,和許多圈友一起交流職場和分析方法的問題。
  • 大數據對於學習語言的方式有什麼影響
    大數據的應用正在發生變化,並且可能會改變人們學習新語言的方式。事實上,語言是人們所尋求的信息中複雜卻又受追捧的一種。因為溝通和交流是如此重要,以至於人們積極嘗試採用不同的方法來學習一門新語言。而利用大數據訪問和處理大量信息的能力,語言可以變得更加易於學習和掌握。 什麼是大數據? 大數據旨在尋求研究方法,並在結構上從更大或更複雜的數據集中獲取信息,或處理由傳統數據處理程序和軟體處理的數據集。
  • R語言製作相關圖
    R語言製作相關圖這篇文章是一個英文教程的搬運和整理,前幾天在論文中看到了非常漂亮的相關圖(correlogram),可以通過這個畫出來。相關圖可以非常好的表現數據表中的各個變量之間的相關關係。在這裡使用了R語言中的corrplot包。安裝corrplot包要想在R語言中繪製相關圖,需要先安裝R包。在這裡使用的是「corrplot」包,具體的R語言安裝介紹請看前面的推文R語言安裝部署基礎。
  • 【經管之家】在學習路上不斷成長的經管人,新年快樂!
    當然,時間自有它的偏愛,它偏愛那些有學習能力的人,他們不斷學習,通過一次次的成長找回自己節奏,和時間的滴答聲形成了共振。他們在學習中發現了自己的才能,他們不為潮流所動,甚至帶著幾分偏執,卻能走出一條自主選擇並且一往無前的路。
  • 數據運算-027篇-數據的行合併
    生活科學哥-R語言科學 2020-10-24 6:23       有段時間沒有寫一下R的一些小操作了,因為工作實在太忙,又是要一個周末的時間,依舊早起
  • R語言和Python區別對比,你會選擇哪一個?
    R和Python,你會選擇學習哪個語言呢?這是很多人都會遇到的問題,究竟兩者之間有什麼區別?我們通過多方面來看看吧。1、語言的定義:Python是一種跨平臺的電腦程式設計語言。是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越多被用於獨立的、大型項目的開發。R是用於統計分析、繪圖的語言和操作環境。R是屬於GNU系統的一個自由、免費、原始碼開放的軟體,它是一個用於統計計算和統計製圖的優秀工具。
  • 數據分析師需要考證嗎?
    、表達能力等等,似乎都沒有要有數據分析師證書這項要求。 二、為什麼會有數據分析師證書的存在? 證書算是營銷的關鍵點之一,可以衡量自身學習價值,隨著技能的提升,證書是自己有相關技能的證明,但並不是所有證書都叫「證書」。 可以很認真的告訴你數據分析行業官方含金量高的證書目前沒有,基本上都是以行業協會或者企業形式頒發的,所以含金量你覺得高嗎?
  • 初一學習方法:做筆記
    做筆記是建立在預習的基礎上,有重點地以最簡略的語言記錄老師的講題思路和方法,眼、腦、手、心同時運動的智力活動過程。在課堂筆記方面,首先要記錄老師講課的要點(並不是每一句話)。筆記中特別注重標明重點、難點和老師要求回答的問題,待課後自己消化。
  • 筆記在英語學習中的重要性與記筆記的方法
    記筆記是學生在學習過程中養成的良好習慣。它不僅在平時的研究中起著重要的作用,而且在複習階段也起著重要的作用。那麼,如果筆記學習風格,在英語學習中使用,會起到什麼作用呢?學生在做筆記時,應該注意什麼?接下來,我會詳細解釋給你聽。
  • 律師的「有道雲筆記」整理術(語音直播版)
    舉個例子:我收集法律法規筆記時,除了按專題歸類外,同時會對每個筆記打上一個名為「法條」的標籤。雲筆記的標籤功能,能夠將位於不同文件夾,但是擁有同樣標籤的筆記,篩選出來。於是可以實現對所有保存過多法條筆記,配合雲筆記標籤和的搜索功能,實現所有法條全文檢索。這樣做三個優勢。
  • 目前最全的R語言-圖片的組合與拼接
    前言這篇是作者總結的目前最全的R語言
  • CV學習筆記(十):直方圖
    關注「深度學習衝鴨」,一起學習一起衝鴨!
  • Julia專題:PyPlot的一些用法整理
    微信公眾號:
  • 學習大數據是否意味著一定要學習Java語言
    首先,當前大數據的技術體系還是比較龐大的,並不是所有大數據從業者都需要掌握Java編程,所以也並不是所有人在學習大數據的時候,都需要學習Java。雖然Java作為一門流行程度比較高的全場景程式語言,在大數據領域有比較廣泛的應用,但是可以代替Java語言的程式語言也不少,比如Python、R、Scala、Go等程式語言也都可以完成大數據領域的編程任務。