楼主: CDA网校
1924 0

[数据挖掘新闻] R语言数据集行列互换技巧 [推广有奖]

管理员

已卖:189份资源

泰斗

3%

还不是VIP/贵宾

-

威望
3
论坛币
118687 个
通用积分
10407.6570
学术水平
278 点
热心指数
286 点
信用等级
253 点
经验
228235 点
帖子
6932
精华
19
在线时间
4378 小时
注册时间
2019-9-13
最后登录
2026-1-8

初级热心勋章

楼主
CDA网校 学生认证  发表于 2021-5-24 18:31:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
致力于以优质的人工智能在线教育资源助力学员的DT职业梦想!课程内容涵盖数据分析机器学习深度学习人工智能tensorFlowPyTorch知识图谱等众多核心技术及行业案例,让每一个学员都可以在线灵活学习,快速掌握AI时代的前沿技术。PS:私信我即可获取CDA会员1个月免费试听机会

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

这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包
一、宽转长——melt()、gather()
[python] view plain copy

    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" #转换后的度量值名称  
    )  

输出结果
[python] view plain copy

    > 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()函数怎么用
[python] view plain copy

    > #宽转长——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()函数
[python] view plain copy

    #长转宽——dcast  
    dcast(  
      data=mydata1,  
      name+address~Year  
      #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式  
      #右侧分类变量的类别个数  
    )  

[python] view plain copy

    > #长转宽——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()
[python] view plain copy

    #长转宽——spread  
    tidyr::spread(  
      data=mydata1,  
      key=Year,  
      value=sale  
    )  

[python] view plain copy

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


扫码下载CDA数据分析师APP,更多免费精彩内容等你来学!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 数据集 CDA数据分析师 address reshape

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-9 07:30