R语言——reshape2包、tidyr包、dplyr包(五)

目录

一、数据转换之reshape2包:melt与dcast函数

二、数据转换之tidyr包:gather与spread函数,separate与unite函数

三、据转换之dplyr包

四、参考


一、数据转换之reshape2包:melt与dcast函数

merge 函数

使用merge函数

x <- data.frame(k1=c(NA,NA,3,4,5),k2=c(1,NA,NA,4,5),data=1:5)

y <- data.frame(k1=c(NA,2,NA,4,5),k2=c(NA,NA,3,4,5),data=1:5)

【使用 cbind 或 rbind 无法区分哪部分来自 x , 哪部分来自 y 。】

merge(x,y,by)合并函数:by表示根据x和y中的某一列进行合并。如:

merge(x,y,by=c("k1","k2"))

reshape2 包

安装reshape2包:install.packages('reashape2')

加载reshape2包:library(reshape2)

(使用R中的airquality数据集做演示)

names(airquality) <- tolower(names(airquality))

aql <- melt(airquality,id.vars = c("month","day")) #将数据中的month和day作为id信息,宽数据变长数据。

aqw <- dcast(aql,month~variable,fun.aggregate=sum,na.rm=TRUE) #长数据变宽数据。

这里的~表示相关联,说明二者有关系,但不一定是相等;fun.aggregate表示给定一个函数指定如何重塑数据;na.rm表示移除na数据。

二、数据转换之tidyr包:gather与spread函数,separate与unite函数

安装tidyr包

tdata <- mtcars[1:10,1:3]

tdata <- data.frame(names=rownames(tdata),tdata)

gather(tdata,key="Key",value="Value",cyl,disp,mpg) #宽数据变长数据,类似于melt,tdata是数据框,key为标签,value为对应值。

gather(tdata,key="Key",value="Value",cyl,-disp) #disp单独放到一列中

gdata <- gather(tdata,key="Key",value="Value",2:4) #这里的2:4等于cyl,disp,mpg(或者cyl:mpg)

spread(gdata,key="Key",value="Value") #spread函数与gather函数作用相反,它是将长数据变为宽数据

df <- data.frame(x=c(NA,'a.b','a.d','b.c'))

separate(df,col=x,into=c('A','B')) #将df数据框中的x列,分割为A、B两列,默认识别分隔符为"."

df <- data.frame(x=c(NA,'a.b-c','a-d','b-c'))

sepa <- separate(df,col=x,into=c('A','B'),sep="-") #将df数据框中的x列,分割为A、B两列,分隔符为"-"

unite(sepa,col='AB',A,B,sep="-") #unite函数与separate函数作用相反,将sepa中的A和B列,用连接符"-"连接,组成列AB

三、据转换之dplyr包

dplyr包不仅可以对单个表格进行操作,也可以对双表格进行操作。 功能强大,函数很多。

对单表格的操作

1)dplyr::filter(iris,Sepal.Length>7) #过滤函数。函数前面加上"包名::"是为了防止dplyr包中的函数名与其他函数产生冲突

dplyr::distinct(rbind(iris[1:10, ] , iris[1:15, ])) #去除重复

dplyr::slice(iris,10:15) #slice是切片的意思,可以用于取出数据任意行

dplyr::sample_n(iris,10) #随机取样10行

dplyr::sample_frac(iris,0.1) #按比例随机取样

dplyr::arrange(iris,Sepal.Length) #按照iris中的花萼长度Sepal.Length进行排序

dplyr::arrange(iris,desc(Sepal.Length)) #降序

select函数:dplyr包中的数据框取子集功能,比R自带的subset函数更加强大。

dplyr::mutate(iris,new=Sepal.Length+Petal.Length) #添加新的变量new,其值是Sepal.Length+Petal.Length

2)dplyr包的统计函数

summarise函数:

summarise(iris,avg=mean(Sepal.Length))

summarise(iris,sum=sum(Sepal.Length))

dplyr::group_by(iris,Species) #根据Species对iris进行分组

3)链式操作符%>%

两个百分号中间夹着一个大于号,称为链式操作符,它的功能是用于实现将一个函数的输出传递给下一个函数,作为下一个函数的输入。在RStudio中可以使用ctrl+shift+M快捷键输出来。

如:head(mtcars,20) %>% tail(10) #输出mtcars中的第10到20行

iris %>% group_by(Species) %>% summarise(avg=mean(Sepal.Width)) %>% arrange(avg) #对iris数据集先进行分组,再求平均,最后排序

对双表格的操作

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))

1)左连接

dplyr::left_join(a,b,by="x1")

2)右连接

dplyr::right_join(a,b,by="x1")

3)内连接:取x1的交集

dplyr::inner_join(a,b,by="x1")

4)全连接:取x1的并集

5)半连接:a与b的交集,把b中有的a中没有的去掉

dplyr::semi_join(a,b,by="x1")

6)反连接:a与b的补集,保留a中有而b中没有的观测

dplyr::anti_join(a,b,by="x1")

数据集的合并:

mtcars <- mutate(mtcars,Model=rownames(mtcars))

first <- slice(mtcars,1:20)

second <- slice(mtcars,10:30)

1)取数据集交集:intersect(first,second)

2)取数据集并集:dplyr::union_all(first,second)

3)取非冗余的数据集并集:

dplyr::union(first,second)

4)取first的补集:setdiff(first,second)

四、参考

R语言入门与数据分析

相关推荐
_.Switch24 分钟前
Python 自动化运维持续优化与性能调优
运维·开发语言·python·缓存·自动化·运维开发
徐*红24 分钟前
java 线程池
java·开发语言
尚学教辅学习资料24 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
1 9 J26 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship27 分钟前
Java面试题(2)
java·开发语言
J不A秃V头A30 分钟前
Python爬虫:获取国家货币编码、货币名称
开发语言·爬虫·python
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
无尽的大道4 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程4 小时前
Java基础Day-Sixteen
java·开发语言·windows
放逐者-保持本心,方可放逐4 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架