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