R語言基礎4--dplyr包的函數及用法


R語言基礎系列:


查看dplyr包中有哪些函數

library(dplyr)
ls('package:dplyr')
#目前有290個包

1:篩選函數

  • 1.1 filter函數?? 針對進行操作,提取一個或多個分組變量中的某個觀測
library(dplyr)
library(reshape2) #使用的演示數據集來自這個包
#選擇tips數據框中非吸煙和周日的行進行篩選
sub <- filter(tips,tips$smoker=='No',tips$day=='Sun')
head(sub)
#   total_bill  tip    sex smoker day   time size
# 1      16.99 1.01 Female     No Sun Dinner    2
# 2      10.34 1.66   Male     No Sun Dinner    3
# 3      21.01 3.50   Male     No Sun Dinner    3
# 4      23.68 3.31   Male     No Sun Dinner    2
# 5      24.59 3.61 Female     No Sun Dinner    4
# 6      25.29 4.71   Male     No Sun Dinner    4

??filter和%in%結合使用,可以用于選取一個列中的多個分類變量

sub1 <- filter(tips,day %in% c('Sat','Sun'))

filter()只能篩選出條件為TRUE的行,它會排除那些條件為FALSE和NA的行。
注意:filter函數約等于subsets,但subsets既可以對行進行操作,也可以對列進行操作。

  • 1.2. slice函數 針對進行操作,可以提取指定行數
 sub2 <- slice(tips,1:5) #tips是要操作的數據框,1:5是提取的行
 sub2
#  total_bill  tip    sex smoker day   time size
# 1      16.99 1.01 Female     No Sun Dinner    2
# 2      10.34 1.66   Male     No Sun Dinner    3
# 3      21.01 3.50   Male     No Sun Dinner    3
# 4      23.68 3.31   Male     No Sun Dinner    2
# 5      24.59 3.61 Female     No Sun Dinner    4
  • 1.3. select函數?? 針對進行操作
 sub3 <- select(tips,tip,sex,smoker) #提取tips中的tip, sex, smoker這三列
 head(sub3)
#   tip    sex smoker
# 1 1.01 Female     No
# 2 1.66   Male     No
# 3 3.50   Male     No
# 4 3.31   Male     No
# 5 3.61 Female     No
# 6 4.71   Male     No

 sub4 <- select(tips,2:5) #提取tips中的2-5列
 head(sub4)
#   tip    sex smoker day
# 1 1.01 Female     No Sun
# 2 1.66   Male     No Sun
# 3 3.50   Male     No Sun
# 4 3.31   Male     No Sun
# 5 3.61 Female     No Sun
# 6 4.71   Male     No Sun

 sub5 <- select(tips,tip:time) #提取tips中從tip到time所有的列
 head(sub5)
#   tip    sex smoker day   time
# 1 1.01 Female     No Sun Dinner
# 2 1.66   Male     No Sun Dinner
# 3 3.50   Male     No Sun Dinner
# 4 3.31   Male     No Sun Dinner
# 5 3.61 Female     No Sun Dinner
# 6 4.71   Male     No Sun Dinner

2. arrange函數(排序函數)??

 new_tips <- arrange(tips,total_bill,tip) #如果total_bill是一樣的,就按tip排序
 head(new_tips)
#    total_bill  tip    sex smoker  day   time size
# 68        3.07 1.00 Female    Yes  Sat Dinner    1
# 93        5.75 1.00 Female    Yes  Fri Dinner    2
# 112       7.25 1.00 Female     No  Sat Dinner    1
# 173       7.25 5.15   Male    Yes  Sun Dinner    2
# 150       7.51 2.00   Male     No Thur  Lunch    2
# 196       7.56 1.44   Male     No Thur  Lunch    2

根據total_bill和tips對數據框進行排序(默認升序)

#降序
 new_tips <- arrange(tips,desc(total_bill),tip)
 head(new_tips)
#    total_bill   tip    sex smoker day   time size
# 171      50.81 10.00   Male    Yes Sat Dinner    3
# 213      48.33  9.00   Male     No Sat Dinner    4
# 60       48.27  6.73   Male     No Sat Dinner    4
# 157      48.17  5.00   Male     No Sun Dinner    6
# 183      45.35  3.50   Male    Yes Sun Dinner    3
# 103      44.30  2.50 Female    Yes Sat Dinner    3

缺失值總是排在最后

3. rename函數(對列進行重新命名)

 new_tips <- rename(tips,bill=total_bill)
 head(new_tips)
#    bill  tip    sex smoker day   time size
# 1 16.99 1.01 Female     No Sun Dinner    2
# 2 10.34 1.66   Male     No Sun Dinner    3
# 3 21.01 3.50   Male     No Sun Dinner    3
# 4 23.68 3.31   Male     No Sun Dinner    2
# 5 24.59 3.61 Female     No Sun Dinner    4
# 6 25.29 4.71   Male     No Sun Dinner    4

4. distinct函數(與levels函數有異曲同工之妙)

levels(tips$sex)
# [1] "Female" "Male"
distinct(tips,sex)
#     sex
# 1 Female
# 2   Male
distinct(tips,day)
#    day
# 1   Sun
# 20  Sat
# 78 Thur
# 91  Fri

5. mutate函數 & transform函數(生成新的變量)??

head(mutate(tips,rate=tip/total_bill))
#   total_bill  tip    sex smoker day   time size       rate
# 1      16.99 1.01 Female     No Sun Dinner    2 0.05944673
# 2      10.34 1.66   Male     No Sun Dinner    3 0.16054159
# 3      21.01 3.50   Male     No Sun Dinner    3 0.16658734
# 4      23.68 3.31   Male     No Sun Dinner    2 0.13978041
# 5      24.59 3.61 Female     No Sun Dinner    4 0.14680765
# 6      25.29 4.71   Male     No Sun Dinner    4 0.18623962

新生成了rate變量

head(mutate(tips,rate=tip/total_bill,new_rat=rate*100))
#   total_bill  tip    sex smoker day   time size       rate   new_rat
# 1      16.99 1.01 Female     No Sun Dinner    2 0.05944673  5.944673
# 2      10.34 1.66   Male     No Sun Dinner    3 0.16054159 16.054159
# 3      21.01 3.50   Male     No Sun Dinner    3 0.16658734 16.658734
# 4      23.68 3.31   Male     No Sun Dinner    2 0.13978041 13.978041
# 5      24.59 3.61 Female     No Sun Dinner    4 0.14680765 14.680765
# 6      25.29 4.71   Male     No Sun Dinner    4 0.18623962 18.623962

rate和new_rate可以同步生成
transform函數與mutate函數的不同之處在于:mutate函數 可以同時生成有遞進關系的多個變量,而 transform函數只能一個一個生成。

head(transform(tips,rate=tip/total_bill,new_rat=rate*100))
# Error in eval(substitute(list(...)), `_data`, parent.frame()) : 
#   object 'rate' not found

transform函數必須先生成rate再生成new_rate,mutate函數可以同時生成rate和new_rate。
如果只想保留新變量,可以使用transmute函數()

6. sample_n函數 & sample_frac函數(在數據框中隨機抽取一些行)

sample_n(iris,size=10) #從iris里隨機抽取了10行
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 1           6.4         2.8          5.6         2.1  virginica
# 2           4.4         3.2          1.3         0.2     setosa
# 3           4.3         3.0          1.1         0.1     setosa
# 4           7.0         3.2          4.7         1.4 versicolor
# 5           5.4         3.0          4.5         1.5 versicolor
# 6           5.4         3.4          1.7         0.2     setosa
# 7           7.6         3.0          6.6         2.1  virginica
# 8           6.1         2.8          4.7         1.2 versicolor
# 9           4.6         3.4          1.4         0.3     setosa
# 10          6.3         2.5          4.9         1.5 versicolor

sample_frac(iris,0.1) #從iris里隨機抽取了10%(0.1)行的數據(iris數據框一共150行,返回了15行)
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 1           6.0         2.9          4.5         1.5 versicolor
# 2           5.5         3.5          1.3         0.2     setosa
# 3           6.5         3.0          5.8         2.2  virginica
# 4           7.2         3.6          6.1         2.5  virginica
# 5           5.5         4.2          1.4         0.2     setosa
# 6           7.6         3.0          6.6         2.1  virginica
# 7           7.2         3.2          6.0         1.8  virginica
# 8           5.6         3.0          4.1         1.3 versicolor
# 9           5.2         4.1          1.5         0.1     setosa
# 10          6.0         2.7          5.1         1.6 versicolor
# 11          5.6         2.5          3.9         1.1 versicolor
# 12          6.1         2.8          4.7         1.2 versicolor
# 13          4.5         2.3          1.3         0.3     setosa
# 14          6.5         3.2          5.1         2.0  virginica
# 15          5.1         3.8          1.5         0.3     setosa

7. group_by 分組函數??(可以根據數據框中的分類變量進行分組,然后結合summarise函數進行匯總操作)

group=group_by(tips,smoker)
summarise(group,count=n(),mean_tips=mean(tip),sd_bill=sd(total_bill))
# A tibble: 2 x 4
#  smoker count mean_tips sd_bill
#  <fct>  <int>     <dbl>   <dbl>
# 1 No       151      2.99    8.26
# 2 Yes       93      3.01    9.83

使用group_by函數,根據smoker對tips進行分組。之后采用summarize函數對分組數據進行統計。如上分別計算了smoker和non-smoker的個數、均值和標準差

8. 管道符 %>%??

result <- tips %>% group_by(smoker,sex) %>% summarise(count = n(),mean_tips=mean(tip),sd_bill=sd(total_bill))
result
# A tibble: 4 x 5
# Groups:   smoker [2]
#  smoker sex    count mean_tips sd_bill
#  <fct>  <fct>  <int>     <dbl>   <dbl>
# 1 No     Female    54      2.77    7.29
# 2 No     Male      97      3.11    8.73
# 3 Yes    Female    33      2.93    9.19
# 4 Yes    Male      60      3.05    9.91

9. join函數家族(對數據框進行合并)

  • 9.1 inner_join函數(??和merge一樣)
 df_a <- data.frame(x=c('a','b','c','a','c','b','c'),y=1:7)
df_b <- data.frame(x=c('a','b','a'),z=10:12)
 inner_join(df_a,df_b,by='x')
#  x y  z
# 1 a 1 10
# 2 a 1 12
# 3 b 2 11
# 4 a 4 10
# 5 a 4 12
# 6 b 6 11

根據共有的x來對數據框進行合并,由于第二個數據框中的x沒有c,因而c被刪掉了未被合并

  • 9.2 semi_join函數
semi_join(df_a,df_b,by='x')
#   x y
# 1 a 1
# 2 b 2
# 3 a 4
# 4 b 6

與inner_join類似,但只返回合并后的x和y

  • 9.3 anti_join函數
anti_join(df_a,df_b,by='x')
#   x y
# 1 c 3
# 2 c 5
# 3 c 7

與semi_join完全相反,只返回兩個數據框中沒有重復的值

  • 9.4 left_join
left_join(df_a,df_b,by='x')
#   x y  z
# 1 a 1 10
# 2 a 1 12
# 3 b 2 11
# 4 c 3 NA
# 5 a 4 10
# 6 a 4 12
# 7 c 5 NA
# 8 b 6 11
# 9 c 7 NA

兩個數據框合并時右邊的數據框向左邊的數據框合并,如果左邊的數據框有右邊數據框沒有的觀測,返回NA值。

  • 9.5 right_join
right_join(df_a,df_b,by='x')
#   x y  z
# 1 a 1 10
# 2 a 1 12
# 3 b 2 11
# 4 a 4 10
# 5 a 4 12
# 6 b 6 11

兩個數據框合并時左邊的數據框向右邊的數據框合并,如果左邊的數據框有右邊數據框沒有的觀測,則不予顯示。

10. count函數(對list中針對某個分組變量的各個觀測值的數量進行統計)??

count(tips,smoker)
#  smoker   n
#1     No 151
#2    Yes  93

11. summarise函數

summarise函數對數據進行統計描述,可以將數據框折疊成一行,常與group_by函數搭配使用。group_by()與summarise()的組合構成了使用dplyr包時最常用的操作之一:分組摘要。
比base包中的summary()更加靈活

mtcars %>%
  summarise(mean = mean(disp), n = n()) #查看disp這一列的均值,n = n()看有多少個觀測
#       mean  n
# 1 230.7219 32

# 根據某個變量對某一列分組并統計
mtcars %>%
  group_by(cyl) %>%
  summarise(mean = mean(disp), n = n())
#     cyl  mean     n
#   <dbl> <dbl> <int>
# 1     4  105.    11
# 2     6  183.     7
# 3     8  353.    14

# 同時進行多種統計運算
mtcars %>%
   group_by(cyl) %>%
   summarise(qs = quantile(disp, c(0.25, 0.75)), prob = c(0.25, 0.75))
# `summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
#   A tibble: 6 x 3
#   Groups:   cyl [3]
#     cyl    qs  prob
#   <dbl> <dbl> <dbl>
# 1     4  78.8  0.25
# 2     4 121.   0.75
# 3     6 160    0.25
# 4     6 196.   0.75
# 5     8 302.   0.25
# 6     8 390    0.75

#更多應用見?summarise

dplyr cheatsheet

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容