美文网首页R语言与统计分析
数据录入与格式转换(reshape2、tidyr包)

数据录入与格式转换(reshape2、tidyr包)

作者: 谢俊飞 | 来源:发表于2020-03-23 17:44 被阅读0次

    在实验数据产出之后,绘制图形时存在两个问题,首先是数据录入格式的问题,其次是数据转换的问题。

    (一):数据录入[1]

    举例:用两种饲料喂食橘小实蝇(处理),4个生物重复,待其性成熟后每日统计产卵量,连续统计4天,试录入数据。

    1.1 宽数据格式

    宽数据是指数据集对所有的变量进行了明确的细分,各变量的值不存在重复循环的情况也无法归类。数据总体的表现为变量多而观察值少。

    宽格式
    1.2 长数据格式

    长数据一般是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类),表格整体的形状为长方形,即 变量少而观察值多。

    长数据

    (二):数据转换

    2.1 reshape2包

    Reshape包主要是用来做数据变形的。其中主要的有两个函数melt和dcast1。其中melt主要用于宽变长,而dcast1主要用于长变宽。

    2.1.1 宽格式转长格式[2]
    # 数组(array)类型
    datax <- array(1:8, dim=c(2,2,2)) 
    melt(datax)
    
    # 列表数据
    melt(data, id.vars, measure.vars, 
         variable.name = "variable", ..., na.rm = FALSE, 
         value.name = "value") 
    
    • id.vars 是被当做维度的列变量,每个变量在结果中占一列;
    • measure.vars 是被当成观测值的列变量,它们的列变量名称和值分别组成 variable 和 value两列;
    • 列变量名称用variable.name 和 value.name来指定。

    var.ids 可以写成id,measure.vars可以写成measure。id(即var.ids)和观测值(即measure.vars)这两个参数可以只指定其中一个,剩余的列被当成另外一个参数的值;如果两个都省略,数值型的列被看成观测值,其他的被当成id。如果想省略参数或者去掉部分数据,参数名最好用 id/measure,否则得到的结果很可能不是你要的。

    2.1.2 长格式转宽格式[3]
    • dcast:针对数据框
    • acast:针对向量、矩阵、数组
    dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL,
     fill = NULL, drop = TRUE,value.var = guess_value(data))
    
    • data:以溶解的数据框(通常是melt函数创建的);
    • formula:描述输出结果的公式,比如x~y,则x表示数据透视表的行,y代表数据透视表的列;
    • fun.aggregate:聚合函数。如果要聚合输出结果中一溶解的数据,用这个参数可以设置聚合函数。可以使用自定义函数;
    • margins:相当于透视表中的行总计和列总计;
    • subset:选取满足一些特定值的数据,相当于Excel透视表的筛选。例如, subset =.(variable ==“length”);
    • value.var:存储值的列的名称。
    2.2 tidyr包[4][5]

    tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能;
    gather和spread函数将数据在长格式和宽格式之间相互转化,应用在比如稀疏矩阵和稠密矩阵之间的转化;

    2.2.1 宽格式转长格式
    # gather的用法
    gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
    
    • data:需要被转换的宽形表;
    • key:将原数据框中的所有列赋给一个新变量key;
    • value:将原数据框中的所有值赋给一个新变量value…:可以指定哪些列聚到同一列中;
    • ...:包含值的源列的名称;
    • na.rm:是否删除缺失值;
    • convert=FALSE:是否需要进行类型转换;
    • factor_key=FALSE:是否存储为字符向量,否则存储为因子,按照原始顺序排列。
    2.2.2 长格式转宽格式[5]
    # spread的用法:
    spread(data, key, value, fill = NA, convert = FALSE, drop =TRUE,
    sep = NULL)
    
    • data:为需要转换的长形表;
    • key:需要将变量值拓展为字段的变量;
    • value:需要分散的值;
    • fill:对于缺失值,可将fill的值赋值给被转型后的缺失值。

    (三):数据演示[6]

    3.1 数据录入
    # 在宽格式和长格式之间转换数据
    rm(list = ls())
    olddata_wide <- read.table(header=TRUE, text='
     subject sex control cond1 cond2
           1   M     7.9  12.3  10.7
           2   F     6.3  10.6  11.1
           3   F     9.5  13.1  13.8
           4   M    11.5  13.4  12.9
    ')
    # Make sure the subject column is a factor
    olddata_wide$subject <- factor(olddata_wide$subject)
    
    olddata_long <- read.table(header=TRUE, text='
     subject sex condition measurement
           1   M   control         7.9
           1   M     cond1        12.3
           1   M     cond2        10.7
           2   F   control         6.3
           2   F     cond1        10.6
           2   F     cond2        11.1
           3   F   control         9.5
           3   F     cond1        13.1
           3   F     cond2        13.8
           4   M   control        11.5
           4   M     cond1        13.4
           4   M     cond2        12.9
    ')
    # Make sure the subject column is a factor
    olddata_long$subject <- factor(olddata_long$subject)
    
    3.2 数据转换
    ##################################宽数据转换####################################
    olddata_wide
    # tidyr package
    library(tidyr)
    data_long <- gather(data = olddata_wide, key = condition,
                        value = measurement, control:cond2, factor_key = TRUE)
    data_long
    # reshape2  package
    library(reshape2)
    data_long <- melt(data = olddata_wide, id.vars=c("subject", "sex"), 
                      measure.vars= c("control","cond1","cond2"),
                      variable.name = "variable", value.name = "value")
    data_long
    # 可以简写为 melt(olddata_wide, id.vars=c("subject", "sex"))
    
    ##################################长数据转换####################################
    olddata_long
    # tidyr package
    library(tidyr)
    data_wide <- spread(data = olddata_long, key = condition, value = measurement)
    data_wide
    
    # reshape2  package
    library(reshape2)
    data_wide <- dcast(data = olddata_long, formula = subject + sex ~ condition, 
                       value.var="measurement")
    data_wide
    

    参考资料:


    1. R语言数据格式 长数据 和 宽数据 之间的转换

    2. reshape/reshape2 包的melt函数

    3. 利用reshape2包进行数据逆透视和数据透视

    4. tidyr包:reshape2的替代者,功能更纯粹

    5. R语言tidyr包数据变换函数

    6. Converting data between wide and long format

    相关文章

      网友评论

        本文标题:数据录入与格式转换(reshape2、tidyr包)

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