R语言 数据集行列互换的技巧分享

 更新时间:2021年03月27日 12:07:52   作者:数据蜂鸟  
这篇文章主要介绍了R语言 数据集行列互换的技巧分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。

这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包

一、宽转长——melt()、gather()

mydata<-data.frame(
 name=c("store1","store2","store3","store4"),
 address=c("普陀区","黄浦区","徐汇区","浦东新区"),
 sale2014=c(3000,2500,2100,1000),
 sale2015=c(3020,2800,3900,2000),
 sale2016=c(5150,3600,2700,2500),
 sale2017=c(4450,4100,4000,3200)
)
#宽转长——melt
mydata1<-melt(
 mydata,
 id.vars=c("address","name"),#要保留的主字段
 variable.name = "Year",#转换后的分类字段名称(维度)
 value.name = "Sale" #转换后的度量值名称
)

输出结果

> mydata1<-melt(
+ mydata,
+ id.vars=c("address","name"),#要保留的主字段
+ variable.name = "Year",#转换后的分类字段名称(维度)
+ value.name = "Sale" #转换后的度量值名称
+ )
> mydata1
 address name  Year Sale
1 普陀区 store1 sale2014 3000
2 黄浦区 store2 sale2014 2500
3 徐汇区 store3 sale2014 2100
4 浦东新区 store4 sale2014 1000
5 普陀区 store1 sale2015 3020
6 黄浦区 store2 sale2015 2800
7 徐汇区 store3 sale2015 3900
8 浦东新区 store4 sale2015 2000
9 普陀区 store1 sale2016 5150
10 黄浦区 store2 sale2016 3600
11 徐汇区 store3 sale2016 2700
12 浦东新区 store4 sale2016 2500
13 普陀区 store1 sale2017 4450
14 黄浦区 store2 sale2017 4100
15 徐汇区 store3 sale2017 4000
16 浦东新区 store4 sale2017 3200

再来看看gather()函数怎么用

> #宽转长——gather
> mydata1<-tidyr::gather(
+ data=mydata,
+ key="Year",
+ value="sale",
+ sale2014:sale2017
+ )
> mydata1
  name address  Year sale
1 store1 普陀区 sale2014 3000
2 store2 黄浦区 sale2014 2500
3 store3 徐汇区 sale2014 2100
4 store4 浦东新区 sale2014 1000
5 store1 普陀区 sale2015 3020
6 store2 黄浦区 sale2015 2800
7 store3 徐汇区 sale2015 3900
8 store4 浦东新区 sale2015 2000
9 store1 普陀区 sale2016 5150
10 store2 黄浦区 sale2016 3600
11 store3 徐汇区 sale2016 2700
12 store4 浦东新区 sale2016 2500
13 store1 普陀区 sale2017 4450
14 store2 黄浦区 sale2017 4100
15 store3 徐汇区 sale2017 4000
16 store4 浦东新区 sale2017 3200

和melt()函数不同,gather()函数需要指定关键字段key,以及关键字段对应的值value,但是gather()函数更加好理解。

二、长转宽——dcast()和spread()

还是用上面的data1数据集,先来看看dcast()函数

#长转宽——dcast
dcast(
 data=mydata1,
 name+address~Year
 #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式
 #右侧分类变量的类别个数
)
> #长转宽——dcast
> dcast(
+ data=mydata1,
+ name+address~Year
+ #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式
+ #右侧分类变量的类别个数
+ )
Using sale as value column: use value.var to override.
 name address sale2014 sale2015 sale2016 sale2017
1 store1 普陀区  3000  3020  5150  4450
2 store2 黄浦区  2500  2800  3600  4100
3 store3 徐汇区  2100  3900  2700  4000
4 store4 浦东新区  1000  2000  2500  3200

dcast()函数的使用规则需要琢磨下才能理解,大家好好看看注释部分,再来看看spread()

#长转宽——spread
tidyr::spread(
 data=mydata1,
 key=Year,
 value=sale
)
> #长转宽——spread
> tidyr::spread(
+ data=mydata1,
+ key=Year,
+ value=sale
+ )
 name address sale2014 sale2015 sale2016 sale2017
1 store1 普陀区  3000  3020  5150  4450
2 store2 黄浦区  2500  2800  3600  4100
3 store3 徐汇区  2100  3900  2700  4000
4 store4 浦东新区  1000  2000  2500  3200

直接调用tidyr::spread,需要指定关键字段key和对应的值value。

但是从理解上来看,我个人更喜欢tidyr包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!

补充:利用R语言对数据行列转制

使用软件:R语言,mysql

使用系统:ubuntu16.04

使用效果前后对比:

使用前

x1 x2 y
a A 1
b B 2
c C 3
a A 4

使用后(里面的数值可以进行多种变换,主要是把x1,x2改为他们的交叉表)

A B C
a 5(1+4) NA NA
b NA 2 NA
c NA NA 3

1.R语言与mysql的数据库连接

下载RMysql(由于我使用的是ubuntu,所以使用RMysql):

install.packages("RMySQL")

加载所需要的程辑包:

library(RMySQL)

将mysql数据导入R:

con<-dbConnect(MySQL(),dbname="database_name",user="user_name",password="password")

导入后,所得数据类型是数据框(data.frame)

对于RMySQL这个包,比较重要的语句有这几个:

summary(con) : 用于查看con对应的mysql信息

dbListTables(con) :用于查看con中的所有table

dbRemoveTable(con,”table_name”)

dbReadTable(con,”table_name”)

dbWriteTable(con,”table_name”,value) 其中value类型需要为数据框

2.在R中实现数据变换

我们使用以上的语句,读取所需要变换的表

data=dbReadTable(con,"table_name")

然后使用一个重要的函数:tapply()

注意,我下面使用的是我之前举例所用的表

data2=tapply(data\$y,list(data\$x1,data$x2),sum)

对于tapply(x,list(a,b),fac)

a和b是形成交叉表的行列表头

而x则是取值,我们当然可以不使用data里面的值当作x

fac则是对x进行的函数运算,比如使用sum,就是将相同的x1,x2的y相加

3.将数据导回mysql

上面我们已经把数据变换为想要的表格形式了,不过,使用了tapply后,data2的类会变为矩阵(matrix),要想知道数据类型,在R中使用class()便可以查看,而我们所使用的RMySQL包将r中数据写入mysql是需要用数据框的,所以我们要转换矩阵为数据框,那么要怎么做呢,很简单

data3=data.frame(data2)

这样,我们的data3便是一个数据框了,使用语句

dbWriteTable(con,test,data3)

便写入了一个table于mysql,名字叫做test,数据值为data3.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • R语言boxplot函数深入讲解

    R语言boxplot函数深入讲解

    这篇文章主要介绍了R语言boxplot函数深入讲解,文中图文讲解的很透彻,有感兴趣的同学可以研究下
    2021-03-03
  • R语言 出现矩阵/缺失值的解决方案

    R语言 出现矩阵/缺失值的解决方案

    这篇文章主要介绍了R语言 出现矩阵/缺失值的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • R语言编程数学分析重读微积分理解极限算法

    R语言编程数学分析重读微积分理解极限算法

    这篇文章主要为大家介绍了R语言编程重读微积分数学分析理解极限算法的详细过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • R语言将变量分组的3种方法实例(含cut函数说明)

    R语言将变量分组的3种方法实例(含cut函数说明)

    在数据处理分析过程中,变量分组是经常遇到的,下面这篇文章主要给大家介绍了关于R语言将变量分组的3种方法,其中含cut函数说明的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • R语言变量级别的数据处理操作

    R语言变量级别的数据处理操作

    这篇文章主要介绍了R语言变量级别的数据处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 使用R语言批量修改文件名的方法

    使用R语言批量修改文件名的方法

    这篇文章主要介绍了使用R语言批量修改文件名的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 解决R语言报错:Error in y + 1:non-numeric argument to binary operator

    解决R语言报错:Error in y + 1:non-numeric argument to binary

    R语言编程中的常见错误有一些错误是R的初学者和经验丰富的R程序员都可能常犯的,下面这篇文章主要给大家介绍了关于解决R语言报错:Error in y + 1:non-numeric argument to binary operator的相关资料,需要的朋友可以参考下
    2022-11-11
  • R语言 实现多行注释的方式

    R语言 实现多行注释的方式

    这篇文章主要介绍了R语言 实现多行注释的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 数模技巧不用for循环且使用ggplot2实现地图上连线

    数模技巧不用for循环且使用ggplot2实现地图上连线

    这篇文章主要为大家介绍了一个数模技巧怎样使用ggplot2不用for循环来实现地图上连线,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • R语言rmarkdown使用安装教程

    R语言rmarkdown使用安装教程

    markdown是文本处理的标记语言,它的功能类似于word,但与word中各种排版、字体设置不同,markdown能使我们更专注于码字这件事,用标记语法来代替常见的排版格式,Rmarkdown基于R中的文本处理格式,这篇文章主要介绍了R语言rmarkdown使用安装教程,需要的朋友可以参考下
    2024-02-02

最新评论