【R语言】--- 宽数据和长数据之间的相互转换

Python040

【R语言】--- 宽数据和长数据之间的相互转换,第1张

宽数据是指数据集对所有的变量进行了明确的细分,各变量的值不存在重复循环的情况也无法归类。数据总体的表现为 变量多而观察值少。每一列为一个变量,每一行为变量所对应的值。例如s1-s10为变量名:

长数据是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类),表格整体的形状为长方形,即 变量少而观察值多。一列包含了所有的变量,而另一列则是与之相关的值。例如S包含了所有的变量名:

长数据与宽数据之间的转换通常是作图需要,宽数据格式无法利用ggplot做出图形。例如分组柱状图等均需要长数据。此外,当数据清洗完成后,导入某些软件时,例如导入SPSS软件进行方差分析或者相关性分析等时候,宽数据格式会更好。因此需要对数据进行长宽格式相互转换。

目前常用的转换方式有两种,分别是手动复制粘贴和软件辅助(本文仅涉及R语言:R语言主要有tidyr包和reshape2包)。如数据量小的话,手动复制粘贴也是可以的;但当数据量十分庞大时,利用软件转换还是比较方便的。本文介绍R语言的tidyr包和reshape2包,掌握好这两个包的转换方法,数据前处理将会轻松很多。

可以通过R语言判断两种方法转化后的数据是否完全一致

可以用R语言判断两种方法转化后的数据是否完全一致,返回TRUE则为完全相等

由于data_wide_s的s1-s10并非按照数字顺序排列,因此有FALSE,但实际上是没有问题的

通过这里也可以看到,两种方法转换的数据观测值数和变量数一致,说明没有问题。

[1] https://blog.csdn.net/Ray_zhu/article/details/78679913

[2] https://cran.r-project.org/web/packages/tidyr/index.html

[3] https://cran.r-project.org/web/packages/reshape2/index.html

R语言数据集行列互换技巧现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包一、宽转长——melt()、gather()[python] view plain copymydata<-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包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!