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.

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

(0)

相关推荐

  • R语言 实现将数据框中的字符类型数字转换为数值

    场景1 我现在有一个数据框datexpr,里面的数字都是以字符型表示的,像这样 > datexpr[1,1] [1] " 1.143773961" 现在我想把这个数据框中的字符型数字全部转为数值型数字 使用下面语句即可 datexpr2=as.data.frame(lapply(datexpr,as.numeric)) 现在再次查看,就是数值型啦,整个数据框中的内容也都是数值型的啦 > datexpr2[1,1] [1] 1.143774 场景2 我现在有一个数据框date

  • R语言 Factor类型的变量使用说明

    factor类型的创建 1. factor( ) > credit_rating <- c("BB", "AAA", "AA", "CCC", "AA", "AAA", "B", "BB") #生成名为credit_rating的字符向量 > credit_factor <- factor(credit_rating) #

  • R语言 实现将factor转换成numeric方法

    方法1: such as : x <- factor(c(3,4,5,1)) as.numeric(x) [1]2 3 4 1 最好是这样: as.numeric(levels(x)[x]) [1] 3 4 5 1 方法2: as.numeric(as.character()) 该方法最好! 方法3: read.table时候就读成数值型,R读的时候默认"NA"是missing,如果你的数据不是用NA来表示missing,那么这一列就读成string或者factor了 补充:R语

  • R语言 实现data.frame 分组计数、求和等

    df为1个data.frame对象,有stratum和psu两列,这里统计stratum列计数 方法1: cnt = table(df$stratum) 方法2: cnt = tapply(df$psu, INDEX=df$stratum, FUN=length) 在方法2的基础上,只要改变FUN函数就可以实现分组求和.求均值等功能,如下 分组求均值: tapply(df$psu, INDEX=df$stratum, FUN=mean) #(等价于python中的df.groupby('stra

  • R语言 实现list类型数据转换

    例如: > a=list(c('232','34'),c('good','bad'),c(1,5)) > a [[1]] [1] "232" "34" [[2]] [1] "good" "bad" [[3]] [1] 1 5 > names(a)=c('d','w','j') > a $d [1] "232" "34" $w [1] "good"

  • 如何改变R语言默认存储包的路径

    怎么更改R中包的存储路径呢? 方法一 可以在R里面用如下命令 .libPaths("C:/Program Files/R/R-3.3.1/library") 方法二 在安装某一个包得时候用如下命令 install.packages("thepackage",lib="/path/to/directory/with/libraries") 补充:如何永久改变R中 .libPaths()?R语言修改 libPath包的储存路径 写在前面 我们有时候新

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

    现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了. 这里给大家介绍4个函数,其中melt().dcast()来自reshape2包,gather().spread()来自tidyr包 一.宽转长--melt().gather() mydata<-data.frame( name=c("store1","store2","store3","sto

  • 基于R语言中的各种更新方法分享

    宏包的更新 卸载package remove.packages("mypackage") 查看的version R.version 或者 getRversion() 查看package的version packageVersion("mypackage") 更新包 update.packages() 或者 update.packages(ask = FALSE) 删除包 remove.packages("mypackage") R软件的更新 in

  • R语言对数据库进行操作的实例详解

    数据是关系数据库系统以规范化格式存储. 因此,要进行统计计算,我们将需要非常先进和复杂的Sql查询. 但R语言可以轻松地连接到许多关系数据库,如MySql,Oracle,Sql服务器等,并从它们获取记录作为数据框. 一旦数据在R语言环境中可用,它就变成正常的R语言数据集,并且可以使用所有强大的包和函数来操作或分析. 在本教程中,我们将使用MySql作为连接到R语言的参考数据库. RMySQL包 R语言有一个名为"RMySQL"的内置包,它提供与MySql数据库之间的本地连接. 您可以使

  • R语言 实现将1对多数据与1对1数据互换

    想了好长时间名字,不知道要解决的问题的名字叫什么,直接上问题demo 问题demo 现在有用户消费金额的数据: 用户 日期 金额 小明 2016-01 300 小明 2016-02 500 小明 2016-03 400 小刘 2016-01 700 小刘 2016-02 800 小刘 2016-03 600 我将以上数据格式为一对多数据(想不出好名字,敬请大家拍砖) 还有一种数据形式如下,我将如下格式数据称为1对1数据 用户 2016-01 2016-02 2016-03 小明 300 500

  • R语言数据可视化ggplot绘制置信区间与分组绘图技巧

    目录 1. 单组情况 1)构造数据集 2)绘制置信区间 2. 多组情况 方法1 1)构造数据集 2)绘制置信区间 方法2 1)构造数据集 2)绘制置信区间 3)美化 1. 单组情况 1)构造数据集 x <- 1:10 y <- x^2 ci_l <- x^2 - 0.5 * x ci_r <- x^2 + 0.5 * x dat_plot <- data.frame(x, y, ci_l, ci_r) 数据集长下面这样: x y ci_l ci_r 1 1 1 0.5 1.5

  • R语言绘制带ErrorBar的分组条形图代码的分享

    目录 第一种实现方法:用aggregate计算数据 第二种实现方法:用dplyr包计算数据 笔者近期画了一张带error bar的分组条形图,将相关的代码分享一下. 感谢网友青山屋主的建议,提示笔者要严谨区分技术重复和生物学重复,所以笔者对文章做修改后重发.如果各位有任何建议,欢迎指正. 本文旨在给出一种利用R对生物学重复数据画带error bar的分组条形图的方法. 所用数据是模拟生成的:分成三个组,每个组进行了若干次生物学重复:测量的是3种基因的表达量.数据的部分内容如下: ## gene1

  • python语言使用技巧分享

    一 在写之前 最好指定python的路径: #!/usr/bin/python python 在linux中需要添加编码方式:以免出现中文乱码 # -*- coding: UTF-8 –*- 二 在各类语言中,python应该是最会利用识缩进的语言 ,他的for语句即使有多行也不需要想java,C++.c一样使用{} ,可以像js.swift一样同换行符代表一句话,而不是使用: 号.有学过语言背景的同学请注意: 在python看来: 如果改变了缩进的方式,例如在第二个for上缩进,会导致错误:

  • R语言包ggplot实现分面去掉小标题的灰色底色小技巧

    目录 当我们在使用 ggplot 时,使用分面通常会长下面这样(这里用 ggplot 的官方案例): p <- ggplot(mpg, aes(displ, hwy)) + geom_point() p + facet_wrap(~class) 此时,我们想将背景的灰色底色去掉,可以用我们常用的 theme_bw(): p + facet_wrap(~class) + theme_bw() 此时如果背景的灰色网格不想要了,可以接着添加 theme(panel.grid = element_bla

  • R语言技巧Rcpp与Eigen库之间的相互转换

    当我们在使用Rcpp时,进行矩阵运算最简单的是使用Eigen库进行相关操作,可以很轻松地讲R中向量化与矩阵化的思想应用到C++代码上,从而对代码进行加速.可参考前面的博客:利用RcppEigen进行矩阵运算. 但有时,我们却必须使用Rcpp进行DataFrame,List等对象格式的处理.或者如果我们涉及到缺失值的处理,也需要使用Rcpp中的函数来做. 所以,如何在两种矩阵或向量格式,NumericVector/Matrix与VectorXd/MatrixXd之间相互转化就变得非常重要. 我们可

  • R语言绘图技巧导出高清图方法

    上一次小仙同学分享了 facet violin plot的画法,最后还卖了个关子,给大家留了个悬念.科研文章的插图通常要求比较高,不仅要精准地展示出数据,选对图表类型,还需要简洁优美(?翻译成人话就是,同样的数据能不能多“卖”几分,就看图够不够高大上啦).小仙同学在画图的时候遇到的一个问题就是,RStudio直接导出的图,怎么这么不清晰?为什么教程里别人的图都那么清晰呢?这时候可能就有同学就会说,这还不简单,直接导出矢量图不就可以了吗? 我们来看下,RStudio可以导出的图片格式有这么几种,小

随机推荐