【问题标题】:How to reshape data into wide format?如何将数据重塑为宽格式?
【发布时间】:2011-10-17 09:49:06
【问题描述】:

我有一个这样的数据集:

structure(list(var1 = c("APE", "APE", "APE", "APE", "APE", "APE", "GIT",
"APE", "APE", "APE", "APE", "APE", "APE", "APE", "GIT"), var2 = c("AVVAL",
"AULASU", "APALA", "AEA", "ATUPVA", "ASATAP", "ADLO", "AKOKU", "AVVAL",
"AULASU", "APALA", "AEA", "ATUPVA", "ASATAP", "ADLO"), var3 = c(NA,
NA, 1L, 101L, 17122009L, 1L, NA, 684L, NA, NA, 1L, 10L, 17122L,
1L, NA)), .Names = c("var1", "var2", "var3"), row.names = c(NA,
15L), class = "data.frame")

如何将这些数据重塑为宽格式?我试过这个

reshape(h, idvar="var2", v.names="var3", timevar="var1", direction="wide")

但它没有给我一个正确的结果。正确的结果是:

  var1 ADLO AEA AKOKU APALA ASATAP   ATUPVA AULASU AVVAL
1  APE  NaN 101   NA      1      1 17122009     NA    NA
2  APE  NaN  10   684     1      1    17122     NA    NA
3  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
4  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    已编辑

    我能达到预期结果的唯一方法是在 data.frame 中添加一个新列。在我看来,有一些关于您的数据的隐含信息未包含在数据中。换句话说,必须有某种分组变量将某些记录标识为属于一起。

    由于我无法双重猜测此信息是什么,因此在我的回答中,我将假设GIT 的每次出现都标志着记录的结束:

    x <- grep("GIT", h$var1)
    h$rec <- rep(seq_along(x), times=c(x[1], diff(x)))
    
    library(reshape2)
    mh <- melt(h, measure.vars="var3")
    cast(mh, rec+var1~var2, id.var="rec", measure.var="value", fun.aggregate=mean)
    
      rec var1 ADLO AEA AKOKU APALA ASATAP   ATUPVA AULASU AVVAL
    1   1  APE  NaN  10   NaN     1      1 17122009     NA    NA
    2   1  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
    3   2  APE  NaN  10   684     1      1 17122009     NA    NA
    4   2  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   Na
    

    原答案

    我发现包reshape2 比内置的reshape 函数更容易理解。这个包提供了两个功能:

    • melt做个宽大的data.frame高个子
    • cast 做个高大的 data.frame 宽的

    在你的情况下你需要cast:

    library(reshape2)
    cast(h, var1~var2, value="var3", fun.aggregate=mean)
    
      var1 ADLO AEA AKOKU APALA ASATAP   ATUPVA AULASU AVVAL
    1  APE  NaN  10   684     1      1 17122009     NA    NA
    2  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
    

    【讨论】:

    • 谢谢,但我也想有重复的记录,这样 APE 应该有 2 行。现在这是根据 var1 对数据进行分组,而不是对其进行整形。
    【解决方案2】:

    由于GIT的含义,我添加了一个新变量:

     dat$id <- cumsum(dat$var1=='GIT')
    

    首先我进行聚合:

    datMean <- aggregate(var3 ~ var2 * id, data=dat, FUN=mean)
    
    > datMean
        var2 id     var3
    1    AEA  0      101
    2  APALA  0        1
    3 ASATAP  0        1
    4 ATUPVA  0 17122009
    5    AEA  1       10
    6  AKOKU  1      684
    7  APALA  1        1
    8 ASATAP  1        1
    9 ATUPVA  1    17122
    

    然后从长到宽的转换:

    datWide <- reshape(datMean, direction='wide', idvar='id', timevar='var2')
    
    > datWide
      id var3.AEA var3.APALA var3.ASATAP var3.ATUPVA var3.AKOKU
    1  0      101          1           1    17122009         NA
    5  1       10          1           1       17122        684
    

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2022-01-11
      相关资源
      最近更新 更多