美文网首页
1.Tidy Data的获得与转换(数据的融合与重塑)

1.Tidy Data的获得与转换(数据的融合与重塑)

作者: 心惊梦醒 | 来源:发表于2021-09-27 23:39 被阅读0次

        总结:
        1)melt()函数将数据变成"长格式"-在绘图时很有用的一种格式

    melt()函数工作示意图
        2)melt()函数melt()默认id和measure两个参数互为补集,可只指定一个;两者的并集也可以不是colnames(dataframe),例如上图中measure可以只指定X1或者X2.
        3)dcast()函数:当只重塑不整合时,可与pivot_*()系列函数类似;当即重塑又整合时,功能与summarise()函数类似

        除了tidyverse包中的pivot_longer()和pivot_wider()函数,还可以用reshape2包(作为reshape的重新设计版本,功能更强大)Tidy Data进行操作。
        reshape包并未包含在R的标准安装中,所以要先install.packages("reshape2")。
        下面的示例数据是一个Tidy Data:

    ID<-c(1,1,2,3)
    Time<-c(1,2,1,2)
    X1<-c(5,3,6,2)
    X2<-c(6,5,1,4)
    (data<-data.frame(ID,Time,X1,X2))
      ID Time X1 X2
    1  1    1  5  6
    2  1    2  3  5
    3  2    1  6  1
    4  3    2  2  4
    

        在这个数据集(Tidy Data)中,measurement是指最后两列中的值,每个measurement都能被标识符变量唯一确定。这里的标识符指ID、Time和观测属于X1还是X2,也就是指定ID、Time再知道属于变量X1后就可以唯一确定一个值。
        数据集的融合(melt)是要将数据变成这样一种格式:每个测量变量占一行,行中带有唯一确定这个measurement所需的标识符变量。(可以理解为melt之后的数据有两列是固定的:一列variable,一列value,其他列是标识符变量-也就是参数id指定的列列)。如下:

    > library("reshape2")
    > (mdate<-melt(data,id=c("ID","Time")))
      ID Time variable value
    1  1    1       X1     5
    2  1    2       X1     3
    3  2    1       X1     6
    4  3    2       X1     2
    5  1    1       X2     6
    6  1    2       X2     5
    7  2    1       X2     1
    8  3    2       X2     4
    

        融合后的数据可以用cast系列函数重铸为任何形状。cast系列函数包括dcast()和acast()两个函数,分别用于获得vector/matrix/array输出和dataframe输出。用dcast()函数入门。
        dcast()函数的基本格式为:

    newdata <- dcast(molten_data,formula,FUN)
    

    其中,

    • molten_data是融合后的数据;
    • 对输出是dataframe,formula最多只能有两个维度,formula的格式是:
      rowvar1+rowvar2+... ~ colvar1+colvar2+... ;
      • rowvar1、rowvar2、colvar1、colvar2等是molten data中除了value列之外的其他列。
      • ~前的变量用来确定输出中的各行的内容,~后的变量用来确定输出中各列的内容。
      • 有两个特殊变量 ....,前者代表没有在formula中使用的其他所有变量,后者代表没有变量,所以formula可以是formula=var1~. ;
    • FUN是可选的数据整合函数。
      • 重塑过程中,可以只重塑不整合,也可以整合。当formula中指定的变量不能唯一确定原始数据中的一行(个人理解为formula中指定的所有的变量集合小于molten data中列(除value)变量的集合),则需要提供一个FUN,这个FUN接受数字向量,返回一个summary统计信息【类似dplyr中summarise的功能】。


        R语言实战书籍的Page104

        melt()函数和cast序列函数都可以分为输出为dataframe和输出是array/list。以输出是dataframe为例,melt()函数的Usage:

    melt(
      data,
      id.vars,
      measure.vars,
      variable.name = "variable",
      ...,
      na.rm = FALSE,
      value.name = "value",
      factorsAsStrings = TRUE
    )
    
    • data:输入数据
    • id.vars:ID变量,字符向量或者数字(变量位置)向量
    • measure.vars:mearsure变量,字符向量或者数字(变量位置)向量
    • variable.name:用于存储measure变量的变量名
    • value.name:用于存储measue值的变量名
          id.varsmeasue.vars是互补关系,如果只指定其中一个,则另一个为其补集;如果两个都没指定,则将因子和字符变量作为ID变量,其他的是measure变量。
          输出dataframe中,variable列默认是因子。
          学习dcast()函数的Usage:
    dcast(
      data,
      formula,
      fun.aggregate = NULL,
      ...,
      margins = NULL,
      subset = NULL,
      fill = NULL,
      drop = TRUE,
      value.var = guess_value(data)
    )
    
    • data:molten data frame
    • formula:对dataframe格式的输出,formula最多只有两个维度;其他格式的输出,可以有多个维度,格式为:x_variable + x_2 ~ y_variable + y_2 ~ z_variable ~ z_variable + z_2 ~ ...
    • fun.aggragate:整合函数,若需要指定却未指定,则默认是长度统计
    • margins:用来计算边距的向量
    > names(airquality) <- tolower(names(airquality))
    > aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
    > head(aqm)
      month day variable value
    1     5   1    ozone    41
    2     5   2    ozone    36
    3     5   3    ozone    12
    4     5   4    ozone    18
    6     5   6    ozone    28
    7     5   7    ozone    23
    
    > dcast(aqm, month ~ variable, mean)
      month    ozone  solar.r      wind     temp
    1     5 23.61538 181.2963 11.622581 65.54839
    2     6 29.44444 190.1667 10.266667 79.10000
    3     7 59.11538 216.4839  8.941935 83.90323
    4     8 59.96154 171.8571  8.793548 83.96774
    5     9 31.44828 167.4333 10.180000 76.90000
    # 加边距
    > dcast(aqm, month ~ variable, mean, margins = c("month", "variable"))
      month    ozone  solar.r      wind     temp    (all)
    1     5 23.61538 181.2963 11.622581 65.54839 68.70696
    2     6 29.44444 190.1667 10.266667 79.10000 87.38384
    3     7 59.11538 216.4839  8.941935 83.90323 93.49748
    4     8 59.96154 171.8571  8.793548 83.96774 79.71207
    5     9 31.44828 167.4333 10.180000 76.90000 71.82689
    6 (all) 42.12931 185.9315  9.957516 77.88235 80.05722
    
    • subset:在reshape之前取子集,格式是一个引用表达式(quoted expression):subset = .(取子集的表达式),例如subset= .(time < 10 & chick < 20)
    # 因为要用到 . 函数,所以需要先加载plyr
    > library(plyr)
    # reshape前先取子集
    > dcast(aqm, month ~ variable, mean, subset = .(variable=="ozone"))
      month    ozone
    1     5 23.61538
    2     6 29.44444
    3     7 59.11538
    4     8 59.96154
    5     9 31.44828
    
    • fill:用来填充结构缺失处的值
    • drop:默认为TRUE,表示缺失的组合直接丢掉。也就是重塑后出现缺失值的行就直接丢掉了

    相关文章

      网友评论

          本文标题:1.Tidy Data的获得与转换(数据的融合与重塑)

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