R语言dplyr包处理数据2021.3.6
2021-03-07 本文已影响0人
R语言_茶味先生
1. dplyr包安装与载入
install.packages("dplyr")
library(dplyr)
dplyr包含有很多函数,并且还在不断地被丰富。因为dplyr包中的函数太多,为了避免函数名称和其他包重复而造成歧义,我们通常采用dplyr::函数名来调用dplyr中的函数。
2. 对单个表格操作
这里以iris数据集为例介绍多种函数操作
2.1 筛选--filter函数
dplyr::filter(iris,Sepal.Length>7)#筛选出Sepal.Length大于7的行
图1 筛选结果
2.2 去除重复行--distinct函数
dplyr::distinct(rbind(iris[1:10,],iris[1:20,]))#取出前10行和前20行合并后去除重复行
图2 去除结果
2.3 取出任意行--slice函数
slice函数取出的数据不包含行名,旧版本如果想用slice取出包含行名的数据则可以使用mutate函数
l例如mtcars<-mutate(mtcars,names=rownames(mtcars)),但是新版本的包已经包含行名。
dplyr::slice(iris,10:16)#取出10到16行数据
图3 取出行数据
2.4 随机抽取n行数据--sample_n函数
dplyr::sample_n(iris,10)#随机抽取10行数据
图4 随机抽取10行数据
2.5 按比例随机选取数据--sample_frac函数
dplyr::sample_frac(iris,0.3)#按比例随机抽取数据,抽取原数据的30%
图5 按比例随机选取数据
2.6 对数据进行排序--arrange函数
desc是改变默认排序规则
dplyr::arrange(iris,Sepal.Length)#将Sepal.Length列进行从小到大排序
#dplyr::arrange(iris,desc(Sepal.Length))#方法一:将Sepal.Length列进行从大到小排序
#dplyr::arrange(iris,-Sepal.Length)#方法二:将Sepal.Length列进行从大到小排序
图6 将Sepal.Length列进行排序
2.7 对数据取子集--select函数
比R自带的subset函数更好用
2.8 对数据进行统计计算--summarise函数
dplyr::summarise(iris,avg=mean(Sepal.Length))#对Sepal.Length这一列进行平均数计算
dplyr::summarise(iris,sum=sum(Sepal.Length))#对Sepal.Length这一列进行求和计算
2.9 对数据进行分组--group_by函数
dplyr::group_by(iris,Species)#方法一:按属种不同将数据分为三组
#iris %>% group_by(Species)#方法二:按属种不同将数据分为三组
#iris %>% group_by(Species) %>% summarise(Sepal.Length.avg=mean(Sepal.Length))#用管道函数将分好组后的数据求出各组的Sepal.Length的平均值
#iris %>% group_by(Species) %>% summarise(Sepal.Length.avg=mean(Sepal.Length)) %>% arrange(-Sepal.Length.avg)#将平均值从大到小排序
图7 分组以及计算均值结果
图8 均值排序结果
2.10 添加新的列向量--mutate函数
dplyr::mutate(iris,new=Sepal.Length+Petal.Length)#将花萼和花瓣长度相加后的值赋值给new变量,并添加到数据框中
图9 添加新列
3. 链式操作符%>%
两个百分号中间夹着一个大于号,称为链式操作符,它功能是用于实现将一个函数的输出传递给下一个函数,作为下一个函数的输入。类似于Linux系统中的管道函数。在Rstudio中可以使用ctrl +shift+M快捷键输出出来。
head(mtcars,20) %>% tail(10)#先取出mtcars数据集中前20行,紧接着取这前20行数据的后10行
在dplyr中经常使用这个符号。
4. 对双表格操作
操作的内容主要就是将两个表格的内容进行整合
4.1 左连接(left_join),右连接(right_join),内连接(inner_join),全连接(full_join),反连接(semi_join)和半连接(anti_join)
a=data.frame(x1=c("A","B","C"),x2=c(1,2,3))
b=data.frame(x1=c("A","B","D"),x3=c(T,F,T))
dplyr::left_join(a,b,by="x1")
dplyr::right_join(a,b,by="x1")
dplyr::inner_join(a,b,by="x1")#取x1列的交集
dplyr::full_join(a,b,by="x1")#取x1列的并集
dplyr::semi_join(a,b,by="x1")#根据右侧表的内容对左侧表进行过滤,输出出a中与b的交集部分
dplyr::anti_join(a,b,by="x1")#根据右侧表的内容对左侧表进行过滤,输出出a中与b的补集部分
4.2 取交集(intersect),取并集(union_all),取非冗余的并集(union),取补集(setdiff)
first <- slice(mtcars,1:20)#取mtcars数据集前20行
second<-slice(mtcars,10:30)#取mtcars数据集第10到第30行
dplyr::intersect(first,second)#取两者交集
dplyr::union_all(first,second)#取两者并集,包含重复
dplyr::union(first,second)#取两者并集,去除重复
dplyr::setdiff(first,second)#取出first集合中去除与second交集的部分
图10 setdiff函数