美文网首页R语言数据整理
【R语言】--- 宽数据和长数据之间的相互转换

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

作者: 生态数据 | 来源:发表于2022-02-24 21:05 被阅读0次

    宽数据

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


    宽数据

    长数据

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


    长数据

    为什么要长宽数据相互转换

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

    转换方法

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

    方法示例

    ###长宽格式数据互转###
    #清空工作环境
    rm(list=ls())
    #导入数据(将本数据看出宽格式)
    data<-read.csv("D:/Users/ASUS/Desktop/NR.csv")
    data#本数据共计40行,这里只截图了28行
    

    加载需要用到的两个包

    #使用tidyr包的gather()&spread()函数
    library(tidyr)
    ##使用reshape2包的melt()&dcast()函数
    library(reshape2)  
    

    宽格式转化为长格式

    ############宽格式转化为长格式#################
    #gather()函数将宽格式转化为长格式
    #data为需要转的数据集名,S为原数据列名的新列名,OUT为值的新列名
    data_long_g<-gather(data, S, value, s1:s10)
    data_long_g
    #melt()函数将宽格式转化为长格式
    data_long_m<-melt(data, id.vars = c("OTU"), #需保留的不参与聚合的变量列名
                      measure.vars = c('s1','s2','s3','s4','s5',
                                       's6','s7','s8','s9','s10'),#需要聚合的变量s1-s10
                      variable.name = c('S'),#聚合变量的新列名
                      value.name = 'value')#聚合值的新列名
    data_long_m
    


    两种方法转换的数据观测值数和变量数一致

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

    #判断两种方法转化后的数据是否完全一致
    #返回TRUE则为完全相等
    data_long_g == data_long_m 
    

    长格式转化为宽格式

    ############长格式转化为宽格式#################
    #spread()函数将宽格式转化为长格式
    data_wide_s<-spread(data_long_g, S, value)
    data_wide_s
    #dcast()函数将宽格式转化为长格式
    data_wide_d<-dcast(data_long_m, OTU~data_long_m$S,
                       value.var = 'value')
    data_wide_d
    


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

    data_wide_s == data_wide_d
    

    由于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语言】--- 宽数据和长数据之间的相互转换

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