美文网首页R数据处理学习
R语言数据集行列互换技巧

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

作者: 村狗儿 | 来源:发表于2019-04-14 20:03 被阅读0次

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

这里给大家介绍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包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见

---------------------

作者:数据蜂鸟

来源:CSDN

原文:https://blog.csdn.net/anna_datahummingbird/article/details/80348074

版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

网友评论

    本文标题:R语言数据集行列互换技巧

    本文链接:https://www.haomeiwen.com/subject/qjoswqtx.html