r语言中如何使用reshape2包将宽型数据转换成长型数据

r语言中如何使用reshape2包将宽型数据转换成长型数据

这篇文章主要介绍了r语言中如何使用reshape2包将宽型数据转换成长型数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇r语言中如何使用reshape2包将宽型数据转换成长型数据文章都会有所收获,下面我们一起来看看吧。

长数据 vs 宽数据

对于宽型数据,每列代表一个不同的变量。例如datasets包中的mtcars数据集就是宽型数据:

r语言中如何使用reshape2包将宽型数据转换成长型数据

#WideformatmpgcyldisphpdratwtqsecvsamgearcarbMazdaRX421.061601103.902.62016.460144MazdaRX4Wag21.061601103.902.87517.020144Datsun71022.84108933.852.32018.611141Hornet4Drive21.462581103.083.21519.441031HornetSportabout18.783601753.153.44017.020032Valiant18.162251052.763.46020.221031

对于长型数据,一列包含了所有可能的变量,另一列是对应的取值。上面的数据可以用长型数据来表示:

#Longformatvariablevalue1mpg21.02mpg21.03mpg22.84mpg21.45mpg18.76mpg18.1...variablevalue347carb2348carb2349carb4350carb6351carb8352carb2

长型数据可以包含两个以上的列,尤其是提供ID变量的时候。如下所述。

在实际应用中,宽型数据更具可读性,长型数据则更适合做分析。因此,知道如何在它们之间进行转换非常有用。

reshape2包中两个主要的函数是:

  1. melt——将宽型数据融合成长型数据

  2. cast——将长型数据转成宽型数据

melt

接下来,我们在datasets包中的mtcars数据集上进行操作。它一开始是上面展示的宽型数据。我们要把它融合成下面的长型数据:

mtcars$car<-rownames(mtcars)mtcarsMelt<-melt(mtcars)head(mtcarsMelt)carvariablevalue1MazdaRX4mpg21.02MazdaRX4Wagmpg21.03Datsun710mpg22.84Hornet4Drivempg21.45HornetSportaboutmpg18.76Valiantmpg18.1

注:译者在R里得到的是melt自动选取car作为ID变量,原文是选取car和cyl作为ID变量。要得到相同结果只需在参数id.vars中指定相应变量即可。

我们可以通过参数variable.name和value.name分别对variable和value列重命名。例如,我们想对所有的汽车根据它的汽缸数和齿轮数做分类。可以像下面这样:

mtcarsMelt<-melt(mtcars,id.vars=c('cyl','gear'),variable.name='carVariable',value.name='carValue')head(mtcarsMelt)cylgearcarVariablecarValue164mpg21264mpg21344mpg22.8463mpg21.4583mpg18.7663mpg18.1tail(mtcarsMelt)cylgearcarVariablecarValue31545carPorsche914-231645carLotusEuropa31785carFordPanteraL31865carFerrariDino31985carMaseratiBora32044carVolvo142E

通常,使用变量组合来唯一的识别每个数据点个好办法,但是这里有多个点的cyl和gear组合值却是相同的,这不是好的办法。当你需要把数据转回宽型数据时会有点问题了(下面会看到)。

cast

cast函数的作用是将长型数据转成宽型数据。cast函数的两种主要类型是:

  1. dcast——返回的结果是一个数据框

  2. acast——返回的结果可以是向量、矩阵或者数组

由于数据框对象是最常见的,我将演示如何使用dcast。下面展示的是长型数据转回成宽型数据:

mtcarsMelt<-melt(mtcars)mtcarsCast<-dcast(mtcarsMelt,car~variable)head(mtcarsCast)carmpgcyldisphpdratwtqsecvsamgearcarb1AMCJavelin15.283041503.153.43517.3000322CadillacFleetwood10.484722052.935.25017.9800343CamaroZ2813.383502453.733.84015.4100344ChryslerImperial14.784402303.235.34517.4200345Datsun71022.84108933.852.32018.6111416DodgeChallenger15.583181502.763.52016.870032

dcast函数通过一个式子来把数据转成宽型数据。在本篇译文中,由于我在R上自动的到ID变量只有car,所以我给出的式子是car ~ variable。这里car是ID变量,variable变量列的名称。要想跟原文一样只需在melt时指定id.vars参数即可。

如果我们指定cyl和gear作为ID变量融合数据后,再转回宽型变量时,会得到如下所示的结果:

mtcarsCast<-dcast(mtcarsMelt,cyl+gear~variable)head(mtcarsCast)cylgearmpgdisphpdratwtqsecvsamcarbcar143111111111124488888888883452222222222463222222222256444444444446651111111111

会得到警告信息:Aggregation function missing: defaulting to length。数据集显示的是每个cyl和gear组合的总的观测数。这是因为dcast函数不能唯一标识每个数据点。然而,它还有其他用处。例如,我们通过如下所示的fun.aggregate参数可以得到每个cyl和gear组合值所对应的所有变量的平均值。

mtcars$car<-NULLmtcarsMelt<-melt(mtcars,id.vars=c('cyl','gear'))mtcarsCast<-dcast(mtcarsMelt,cyl+gear~variable,fun.aggregate=mean)head(mtcarsCast)cylgearmpgdisphpdratwtqsecvsamcarb14321.500120.10097.03.702.46500020.01001.00.001.024426.925102.62576.04.112.37812519.61251.00.751.534528.200107.700102.04.101.82650016.80000.51.002.046319.750241.500107.52.923.33750019.83001.00.001.056419.750163.800116.53.913.09375017.67000.50.504.066519.700145.000175.03.622.77000015.50000.01.006.0

这里,我们删除了car列。这是因为我们不希望在mtcarsMelt的value列里存在非数值型数据,否则会得到错误。

关于“r语言中如何使用reshape2包将宽型数据转换成长型数据”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“r语言中如何使用reshape2包将宽型数据转换成长型数据”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2022-03-19 21:12:31
收藏
分享
海报
0 条评论
33
上一篇:vue如何使用setTimeout代替setInterval 下一篇:vue如何统一管理缓存变量
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码