0

我想重塑一个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

我一直在尝试使用reshape2package 来做到这一点,但我无法与var1其他人隔离开来并继续获得结果var2_20var2_30例如结果。有谁知道如何使用reshape2包做到这一点?

数据帧输入:

> 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)) 
4

2 回答 2

3

使用 、 和 的组合,merge如下所示:reshapeunique

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以获得(几乎)您想要的输出。如果需要,您可以重新排列列顺序。

于 2013-01-25T17:08:13.227 回答
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
于 2013-01-25T17:08:49.780 回答