5 reshape2

作者: 陈宇乔 | 来源:发表于2019-04-21 21:06 被阅读4次

    数据分析时要长数据

    长数据有一列数据是变量的类型,有一列是变量的值。长数据不一定只有两列。ggplot2需要长类型的数据,plyr也需要长类型的数据,大多数的模型(比如lm(), glm()以及gam())也需要长数据。

    reshape2 包主要掌握melt和cast两个函数。

    melt函数对宽数据进行处理,得到长数据;
    cast函数对长数据进行处理,得到宽数据;

    宽数据

    #   ozone   wind  temp
    # 1 23.62 11.623 65.55
    # 2 29.44 10.267 79.10
    # 3 59.12  8.942 83.90
    # 4 59.96  8.794 83.97
    

    长数据

    #    variable  value
    # 1     ozone 23.615
    # 2     ozone 29.444
    # 3     ozone 59.115
    # 4     ozone 59.962
    # 5      wind 11.623
    # 6      wind 10.267
    # 7      wind  8.942
    # 8      wind  8.794
    # 9      temp 65.548
    # 10     temp 79.100
    # 11     temp 83.903
    # 12     temp 83.968
    

    melt函数:其中ID variables就是那些能够区分不同行数据的变量,类似于数据库中的主键。

    此处用R内置的airquality数据集,首先将列名改成小写,然后查看相应的数据

    names(airquality) <- tolower(names(airquality))
    
      ozone solar.r wind temp month day
    1    41     190  7.4   67     5   1
    2    36     118  8.0   72     5   2
    3    12     149 12.6   74     5   3
    4    18     313 11.5   62     5   4
    5    NA      NA 14.3   56     5   5
    6    28      NA 14.9   66     5   6
    

    默认情况下,melt认为所有数值列的变量均有值。很多情况下,这都是我们想要的情况。在这里,我们想知道每个月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我们需要告诉melt,month和day是"ID variables"。ID variables就是那些能够区分不同行数据的变量,类似于数据库中的主键。

    aql <- melt(airquality, id.vars = c("month", "day"))
    head(aql)
    
      month day variable value
    1     5   1    ozone    41
    2     5   2    ozone    36
    3     5   3    ozone    12
    4     5   4    ozone    18
    5     5   5    ozone    NA
    6     5   6    ozone    28
    

    如果我们想修改长数据中的列名,该如何操作呢?

    aql <- melt(airquality, id.vars = c("month", "day"),
      variable.name = "climate_variable", 
      value.name = "climate_value")
    head(aql)
    
      month day climate_variable climate_value
    1     5   1            ozone            41
    2     5   2            ozone            36
    3     5   3            ozone            12
    4     5   4            ozone            18
    5     5   5            ozone            NA
    6     5   6            ozone            28
    

    cast函数

    在reshape2中有好几个cast版本的函数。若你经常使用data.frame,就需要使用dcast函数。acast函数返回向量、矩阵或者数组。
    dcast借助于公式来描述数据的形状,左边参数表示"ID variables",而右边的参数表示measured variables。可能需要几次尝试,才能找到合适的公式。
    这里,我们需要告知dcast,month和day是ID variables,variable则表示measured variables。

    aql <- melt(airquality, id.vars = c("month", "day"))
    aqw <- dcast(aql, month + day ~ variable)
    head(aqw)
    
      month day ozone solar.r wind temp
    1     5   1    41     190  7.4   67
    2     5   2    36     118  8.0   72
    3     5   3    12     149 12.6   74
    4     5   4    18     313 11.5   62
    5     5   5    NA      NA 14.3   56
    6     5   6    28      NA 14.9   66
    
    head(airquality) # original data
    
      ozone solar.r wind temp month day
    1    41     190  7.4   67     5   1
    2    36     118  8.0   72     5   2
    3    12     149 12.6   74     5   3
    4    18     313 11.5   62     5   4
    5    NA      NA 14.3   56     5   5
    6    28      NA 14.9   66     5   6
    

    除了需要调整下列变量的顺序,我们已经恢复出原始数据。下图将有助解释所发生的情况。


    here is the dcast illustration

    蓝色阴影块是能够表示每一行数据的ID variables;红色阴影块包含了将待生成数据的列名;而灰色的数据表示用于填充相关区域的数据。

    参考文献

    http://seananderson.ca/2013/10/19/reshape.html

    相关文章

      网友评论

        本文标题:5 reshape2

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