3.使用dplyr进行数据转换

filter()函数可以基于观测的值筛选出一个观测子集。第一个参数是数据框名称,第二个参数以及随后的参数是用来筛选数据框的表达式。
library(dplyr)
library(nycflights13)
nycflights13::flights
filter(flights,month==1,day==1) #dplyr函数从来不修改输入
jan1=filter(flights,month==1,day==1)

缺失值

NA表示未知的值,因此缺失值是可以传染的
想要确定一个值是否为缺失值,可以使用is.na()函数

x=NA
is.na(x)

使用arrange()排列行

arrange()函数的工作方式与filter()函数非常相似,但前者不是选择行,而是改变行的顺序。它接受一个数据框和一组作为排序依据的列名作为参数。如果列名不止一个,那么就是用后面的列在前面排序的基础上继续排序。

arrange(flights,year,month,day)
arrange(flights,arr_time)
arrange(flights,desc(arr_time)) #desc()可以按列进行降序排序

使用select()函数选择列

select()函数可以快速生成一个有用的变量子集

select(flights,year,month,day)
select(flights,year:day)
select(flights,-(year:day))

可以在select()函数中使用一些辅助函数

starts_with('abc')
ends_with('xyz')
contains('ijk')

#rename()函数重新命名变量,以保留所有未明确提及的变量
rename(flights,tail_num=tailnum)
#想要将几个变量移到数据框开头
select(flights,time_hour,air_time,everything())

mutate()添加新变量,mutate()总是将新列添加在数据集的最后

flights_sml=select(flights,year:day,ends_with("delay"),distance,air_time)
#逗号之间是平级关系
flights_sml1=mutate(flights_sml,gain=arr_delay-dep_delay,
                   speed=distance/air_time*60)
colnames(flights_sml1)

#如果只想保留新变量,可以使用transmute()函数
transmute(flights,
          gain=arr_delay-dep_delay,
          hours=air_time/60,
          gain_per_hour=gain/hours)

summarize()进行分组摘要,可以将数据框折叠成一行

group_by()和summarize()的组合是dplyr包最常用的操作之一

summarize(flights,delay=mean(dep_delay,na.rm=T))
#group_by()可以将分析单位从整个数据集更改为单个分组
by_day=group_by(flights,year,month,day) #按年月日进行分组
View(by_day)
summarize(by_day,delay=mean(dep_delay,na.rm=T))
knitr::opts_chunk$set(echo = TRUE)
df <- data.frame(first=c("A",'A','B','B'),
                second=c(1,2,3,4))
df
library(dplyr)
df1 <- df%>%
  group_by(first)%>%
  summarise(y=mean(second)) 

df1

first

y

A   1.5         
B   3.5         
2 rows
detach('package:Rmisc')
detach('package:plyr')

使用管道组合多种操作

by_dest=group_by(flights,dest)
delay=summarize(by_dest,
                count=n(),
                dist=mean(distance,na.rm=T),
                delay=mean(arr_delay,na.rm=T))
delay=filter(delay,count>20,dest!="HNL")
#以上代码可以简化为
delays=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")
  
library(ggplot2)
ggplot(data=delay,mapping=aes(x=dist,y=delay))+
  geom_point(aes(size=count),alpha=1/3)+
  geom_smooth(se=F)

按多个变量分组

使用多个变量进行分组时,每次的摘要统计会用掉一个分组变量,这样就可以轻松地对数据集进行循序渐进的分析

library(nycflights13)
daily=group_by(flights,year,month,day)
(per_day=summarize(daily,flights=n()))
(per_month=summarize(per_day,flights=sum(flights)))
(per_year=summarize(per_month,flights=sum(flights)))

取消分组

取消分组,回到未分组的数据继续操作,用ungroup()函数

daily%>%
ungroup()%>%
summarize(flights=n())

你可能感兴趣的:(3.使用dplyr进行数据转换)