0

次のようなa を再形成したいと思い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_20し続けることができません。パッケージvar2_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)) 
4

2 に答える 2

3

mergereshape、およびuniqueを次のように組み合わせて使用​​します。

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 に答える