【问题标题】:melt multiple groups of measure.vars融化多组 measure.vars
【发布时间】:2014-03-08 13:16:46
【问题描述】:

我有一个 data.table 包含多个跨多年的变量,即:

> dt <- data.table(id=1:3, A_2011=rnorm(3), A_2012=rnorm(3), 
                           B_2011=rnorm(3), B_2012=rnorm(3), 
                           C_2011=rnorm(3), C_2012=rnorm(3))
> dt
   id     A_2011       A_2012    B_2011     B_2012     C_2011     C_2012
1:  1 -0.8262134  0.832013744 -2.320136  0.1275409 -0.1344309  0.7360329
2:  2  0.9350433  0.279966534 -0.725613  0.2514631  1.0246772 -0.2009985
3:  3  1.1520396 -0.005775964  1.376447 -1.2826486 -0.8941282  0.7513872

我想把这张表按年份分成不同的组,即:

> dtLong <- data.table(id=rep(dt[,id], 2), year=c(rep(2011, 3), rep(2012, 3)), 
                       A=c(dt[,A_2011], dt[,A_2012]), 
                       B=c(dt[,B_2011], dt[,B_2012]), 
                       C=c(dt[,C_2011], dt[,C_2012]))
> dtLong
   id year            A          B          C
1:  1 2011 -0.826213405 -2.3201355 -0.1344309
2:  2 2011  0.935043336 -0.7256130  1.0246772
3:  3 2011  1.152039595  1.3764468 -0.8941282
4:  1 2012  0.832013744  0.1275409  0.7360329
5:  2 2012  0.279966534  0.2514631 -0.2009985
6:  3 2012 -0.005775964 -1.2826486  0.7513872

我可以使用reshape2 包中的melt.data.frame 轻松地为一组变量执行此操作:

> melt(dt[,list(id, A_2011, A_2012)], measure.vars=c("A_2011", "A_2012"))

但是对于具有共同“因素”的多个measure.vars 来说,却无法实现这一点。

【问题讨论】:

  • 您也可以从我的“splitstackshape”包中查看merged.stack。用法是:library(splitstackshape); merged.stack(dt, id.vars="id", var.stubs=c("A", "B", "C"), sep="_"),它比reshape 具有处理不平衡数据的优势。在大型数据集上它已经比 reshape 快了,我很快也会用 melt.data.table 更新函数,这应该会更快。
  • 太好了,我会试一试,希望它能解决我当前的问题(reshape 似乎在弄乱真实的数据集,但我无法在小范围内复制该问题)
  • 最好从 Github 安装版本:github.com/mrdwab/splitstackshape

标签: r data.table reshape reshape2


【解决方案1】:

您可以使用 base R 中的 reshape 轻松完成此操作

reshape(dt, varying = 2:7, sep = "_", direction = 'long')

这将为您提供以下输出

      id time          A            B            C
1.2011  1 2011 -0.1602428  0.428154271  0.384892382
2.2011  2 2011  1.4493949  0.178833067  2.404267878
3.2011  3 2011 -0.1952697  1.072979813 -0.653812311
1.2012  1 2012  1.7151334  0.007261567  1.521799983
2.2012  2 2012  1.0866426  0.060728118 -1.158503305
3.2012  3 2012  1.0584738 -0.508854175 -0.008505982

【讨论】:

    【解决方案2】:

    来自 ?melt 样品:

    melt(DT, id=1:2, measure=patterns("^f_", "^d_"), value.factor=TRUE)
    

    【讨论】:

    • 可能更像melt(dt, measure = patterns("^A_", "^B_", "^C")),但它仍然没有返回确切的输出。
    • 是的,如果有人发现这个问题,我只是把它扔进去,也许这个选项对他们来说可能就足够了。抱歉,没有尝试使用 OP 数据集...
    • 这给了我一个错误“melt_check(data, id.vars, measure.vars) 中的错误:找不到函数“patterns””
    • 指的是data.table::melt(和data.table::patterns
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2021-05-26
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多