【问题标题】:reshaping data in R skipping certain measured variables在 R 中重塑数据,跳过某些测量变量
【发布时间】:2013-01-25 16:55:52
【问题描述】:

我想重塑一个看起来像这样的data.frame

     permno         dte ttm var1 var2 var3
1    123  2012-01-01  20    1   10  100
2    123  2012-01-01  30   -1   10  100
3    124  2012-01-01  20    2   20  200
4    124  2012-01-01  30   -2   20  200

我想让我的data.frame 看起来像下面这样:

  permno         dte var1_20 var1_30 var2 var3
1    123  2012-01-01       1      -1   10  100
2    124  2012-01-01       2      -2   20  200

我一直在尝试使用reshape2 包来执行此操作,但我无法将var1 与其他包隔离开来,例如在结果中不断得到var2_20var2_30。有谁知道如何使用reshape2 包做到这一点?

data.frame 输入:

> dput(DF)
structure(list(permno = c(123L, 123L, 124L, 124L), dte = structure(c(1L, 
1L, 1L, 1L), .Label = " 2012-01-01", class = "factor"), ttm = c(20L, 
30L, 20L, 30L), var1 = c(1L, -1L, 2L, -2L), var2 = c(10L, 10L, 
20L, 20L), var3 = c(100L, 100L, 200L, 200L)), .Names = c("permno", 
"dte", "ttm", "var1", "var2", "var3"), class = "data.frame", row.names = c(NA, 
-4L))
> dput(result)
structure(list(permno = 123:124, dte = structure(c(1L, 1L), .Label = " 2012-01-01", class = "factor"), 
    var1_20 = 1:2, var1_30 = c(-1L, -2L), var2 = c(10L, 20L), 
    var3 = c(100L, 200L)), .Names = c("permno", "dte", "var1_20", 
"var1_30", "var2", "var3"), class = "data.frame", row.names = c(NA, 
-2L)) 

【问题讨论】:

    标签: r reshape reshape2


    【解决方案1】:

    使用mergereshapeunique的组合,如下所示:

    unique(merge(DF[-c(3:4)], 
                 reshape(DF[1:4], direction = "wide", 
                         idvar = c("permno", "dte"), 
                         timevar="ttm")))
    #   permno         dte var2 var3 var1.20 var1.30
    # 1    123  2012-01-01   10  100       1      -1
    # 3    124  2012-01-01   20  200       2      -2
    

    基本上,您只对需要重新整形的列进行整形,并在合并之前从原始数据集中删除这些列。您最终会得到重复的行,因此只需将所有这些包装在 unique 中即可(几乎)获得您想要的输出。如果需要,您可以重新排列列顺序。

    【讨论】:

    • +1 很棒的解决方案,这基本上就是我现在正在做的事情。我希望会有“更漂亮”的方式,但如果没有,这可能是要走的路
    【解决方案2】:

    我觉得这个答案相当聪明,但我强烈怀疑我对您的数据做了太多假设,特别是 var2 和 var3 的恒定性质:

    ddply(dat,.(permno,dte,var2,var3),
          function(x) { dcast(x,permno + dte + var2 + var3 ~ ttm,value.var = 'var1') })
      permno         dte var2 var3 20 30
    1    123  2012-01-01   10  100  1 -1
    2    124  2012-01-01   20  200  2 -2
    

    【讨论】:

    • 我对这些假设有类似的怀疑——我对我的回答也有类似的怀疑,但有替代方案总是很好的。 +1
    • +1 我喜欢你在这里的想法。我想知道的一个问题是,由于 var2 和 var3 在实际数据中是 numeric 而不是 integer,这会导致问题(因为 R 中的 123.23 != 123.23 对吗?)
    • @Alex 如果这是一个问题(试试看),您可以使用替代公式系统:library(plyr); dcast(df,list(.(permno,dte,round(var2),round(var3)),.(ttm)),value.var="var1")
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2021-11-11
    • 2021-10-23
    相关资源
    最近更新 更多