【问题标题】:R: reshaping wide to long [duplicate]R:从宽变长[重复]
【发布时间】:2015-12-08 05:04:49
【问题描述】:

我有一个看起来像这样的宽数据框:

    ID Time Amount     CabMean CabNum     PartMean PartNum     DinnMean   DinNum  Ex
1    1    1    27  0.654621546      8           NA       7  0.316791872        6   0
2    1    2    82  0.667461321      3  0.327594876       4  0.346798127        2   1
3    1    3    52  0.313976132      1           NA       6  0.197837257        7   0
4    1    4    99  0.798328712      9  0.913751678       4  0.191679538        9   1

我想将其重新整形(使用 reshape2 包)为采用这种形式的长格式(只是将这些数字组合起来):

  ID Time Amount Ex Type   Mean         Num
1  1    2    50   0  Cab   0.65654321   7
2  1    2    50   0 Part   0.65654321   1
3  1    2    50   0 Dinn   0.65654321   4

我尝试过这样的事情:

reshaped <- melt(data, id.vars = c("ID", "Time", "Amount", "Ex"))

这让我得到了这样的东西:

  ID Time Amount Ex  variable    value
1  1    1    10   0  CabMean 0.6565432
2  1    2    12   0  CabMean 0.6565432

所以我只完成了一半,还不太清楚剩下的部分。我如何(从我当前使用的代码或从全新的代码)将类型(Cab、Part、Dinn)提取为单独的列,并创建 2 个额外的列来保存 Mean 和 Num 值?

【问题讨论】:

  • 基地reshape也可以做到:reshape(dat, idvar=c("ID","Time"), direction="long", varying=list(c(4,6,8),c(5,7,9)), times=c("cab","part","dinn"))

标签: r dataframe reshape reshape2


【解决方案1】:

我们可以使用来自data.tablemelt,它可以使用带有pattern 参数的多个measure 列。我们将 'data.frame' 转换为 'data.table' (setDT(data)),然后将 melt 转换为 'long' 格式。

library(data.table)
DT <- melt(setDT(data), measure=patterns('Mean$', 'Num$'), 
              variable.name='Type', value.name=c('Mean', 'Num'))
DT[, Type:=c('Cab', 'Part', 'Dinn')[Type]]

【讨论】:

  • 如何将类型列中的值重命名为标题中正确的标签部分?
  • @Simon 您可以从列名中gsub 并使用类型作为指示符或直接使用它。我更新了帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多