# dplyr 基础
按值筛选观测 filter()
对行进行重新排序 arrange()
按名称选取列变量 select()
使用现有变量的函数创建新变量 mutate()
将多个值总结为一个摘要统计量 summarize()
以上函数与group_by()函数连用,group_by()可以改变函数的作用范围;让其从整个数据集上的操作变为在每个分组上的分别操作 group_by()
# 数据
nycflights13::flights, 2013年从纽约出发的336 776次航班的信息。
> install.packages("nycflights13")
> library(dplyr)
> library(nycflights13)
> head(flights)
# A tibble: 6 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time
1 2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227
2 2013 1 1 533 529 4 850 830 20 UA 1714 N24211 LGA IAH 227
# ... with 4 more variables: distance , hour , minute , time_hour
# 使用filter()筛选行
filter(.data, ...)
.data是数据框;
...:后面可以是一个或多个参数,但必须是逻辑值,从而保证为TRUE的行才保留。
#筛选1月1日的航班
> filter(flights,month==1,day==1)
# A tibble: 842 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time
1 2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227
## 比较运算符
>, >=, <, <=, !=, ==
浮点数相等使用near()代替==
## 逻辑运算符
& 表示“与”, | 表示“或”, !表示“非”, xor(x,y) 表示“异或”
> x <- c(T,T,F)
> y <- c(F,T,F)
> xor(x,y)
[1] TRUE FALSE FALSE
## 缺失值
NA:not available, 不可用;
is.NA()
# 使用arrange()排列行
arrange(.data, ...)
.data:数据框
...:变量名,多个变量名使用逗号隔开; arrange()将根据这些列对数据框进行排序;
> arrange(flights,year,month,day)
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time
1 2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227
2 2013 1 1 533 529 4 850 830 20 UA 1714 N24211 LGA IAH 227
使用desc() 可以按列进行降序排序:
> arrange(flights,desc(arr_delay))
# 使用select()选择列
select(.data, ...):keeps only the variables you mention
> select(flights,year,month,day)
> select(flights,year,month,day)
# A tibble: 336,776 x 3
year month day
1 2013 1 1
2 2013 1 1
3 2013 1 1
4 2013 1 1
5 2013 1 1
6 2013 1 1
7 2013 1 1
8 2013 1 1
9 2013 1 1
10 2013 1 1
# ... with 336,766 more rows
> select(flights,year:day)
> select(flights,-(year:day)) #删除列
select()函数可以结合一些辅助函数使用:
start_with("abc"): 匹配“abc”开头
ends_with(): 匹配“xyz” 结尾的名称
contains("ijk"): 匹配包含“ijk”的名称
mathces("(.)\1"): 匹配名称中有重复字符的变量;(.)匹配单个字符;\\1指定第一个子匹配项, 第二个匹配模式也是(.)。
num_range("x",1:3): 匹配x1、x2和x3
rename(): 可以对数据框中变量名重命名。
> rename(flights,tail_num = tailnum)
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
1 2013 1 1 517 515 2 830 819 11 UA 1545
2 2013 1 1 533 529 4 850 830 20 UA 1714
# ... with 336,766 more rows, and 8 more variables: tail_num , origin , dest ,
# air_time , distance , hour , minute , time_hour
# 使用mutate添加新变量
mutate()总是将新列添加在数据集的最后
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
>mutate(iris,newCol1=iris$Sepal.Length*2,newCol2=paste(iris$Species,iris$Sepal.Length,sep = ""))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species newCol1 newCol2
1 5.1 3.5 1.4 0.2 setosa 10.2 setosa5.1
2 4.9 3.0 1.4 0.2 setosa 9.8 setosa4.9
3 4.7 3.2 1.3 0.2 setosa 9.4 setosa4.7
4 4.6 3.1 1.5 0.2 setosa 9.2 setosa4.6
5 5.0 3.6 1.4 0.2 setosa 10.0 setosa5
transmute()只保留新变量
>transmute(iris,newCol1=iris$Sepal.Length*2,newCol2=paste(iris$Species,iris$Sepal.Length,sep = ""))
newCol1 newCol2
1 10.2 setosa5.1
2 9.8 setosa4.9
3 9.4 setosa4.7
4 9.2 setosa4.6
5 10.0 setosa5
# 使用summarize()进行分组摘要
group_by()可以将分析单位从整个数据集改为单个分组
ungroup()可以取消分组
> bySpecies<-group_by(iris,Species)
> summarize(bySpecies, meanCol=mean(iris$Sepal.Length,na.rm = T))
# A tibble: 3 x 2
Species meanCol
1 setosa 5.84
2 versicolor 5.84
3 virginica 5.84
> by_day<-group_by(flights,year,month,day) #flights中year,month,day各水平一一组合
使用管道操作: %>%,输入数据或者计算结果通过%>%直接传递给下一步操作
by_dest<-group_by(flights,dest)
delay<-summarize(by_dest,
count=n(), #n()是一个计数函数
dist=mean(distance,na.rm=T),
delay=mean(arr_delay,na.rm = T))
delay<-filter(delay,count>20,dest != "HNL")
by_dest<-flights %>%
group_by(dest)%>%
summarize(
count=n(),
dist=mean(distance,na.rm=T),
delay=mean(arr_delay,na.rm = T)
)%>%
filter(count>20,dest != "HNL")
参考:
R数据科学