5

必要なもの:

次の列を持つ巨大なデータ フレームがあります (さらにいくつかの列がありますが、これらは重要ではありません)。次に例を示します。

    user_id video_id group_id    x   y
1         1        0        0   39 108
2         1        0        0   39 108
3         1       10        0  135 180
4         2        0        0   20 123

もちろん、ユーザー、ビデオ、およびグループ ID は要因です。たとえば、20 本のビデオがありますが、それぞれのビデオには、ユーザーとグループごとにいくつかの「観察」があります。

このデータ フレームを次の形式に変換したいと思います。ここでは、ユーザー ( ) と同じ数の がありx.Nます。y.NN

video_id  x.1   y.1  x.2  y.2  …
       0   39   108   20  123

したがって、 video0の場合、ユーザー 1 の x 値と y 値は、それぞれ列x.1y.1にあります。ユーザー 2 の値は、列x.2y.2などにあります。

私が試したこと:

x, yそれぞれのすべての観測のみで構成されるデータ フレームのリストを自分で作成しましたvideo_id

summaryList = dlply(allData, .(user_id), function(x) unique(x[c("video_id","x","y")]) )

それは次のようになります。

List of 15
 $ 1 :'data.frame': 20 obs. of  3 variables:
  ..$ video_id: Factor w/ 20 levels "0","1","2","3",..: 1 11 8 5 12 9 20 13 7 10 ...
  ..$ x       : int [1:20] 39 135 86 122 28 167 203 433 549 490 ...
  ..$ y       : int [1:20] 108 180 164 103 187 128 185 355 360 368 ...
 $ 2 :'data.frame': 20 obs. of  3 variables:
  ..$ video_id: Factor w/ 20 levels "0","1","2","3",..: 2 14 15 4 20 6 19 3 13 18 ...
  ..$ x       : int [1:20] 128 688 435 218 528 362 299 134 83 417 ...
  ..$ y       : int [1:20] 165 117 135 179 96 328 332 563 623 476 ...

私が立ち往生している場所:

やるべきことは次のとおりです。

  • summaryListに基づいて、 の各データ フレームを互いにマージしvideo_idます。summaryList[1]$`1`リスト内の実際のデータ フレームにアクセスする良い方法が見つかりませんsummaryList[2]$`2`

    @ジェームズは部分的な解決策を見つけました:

    Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
    
  • 列名がユーザー ID の後に名前変更され、そのまま保持されないことを確認してください。現在、 my にsummaryListはユーザー ID に関する情報が含まれておらず、 の出力には、などのReduceように列名が重複x.x y.x x.y y.y x.x y.xしています。

どうすればこれを行うことができますか?または、現在行っている方法よりも簡単に結果を得る方法はありますか?

4

2 に答える 2

4

私はまだ少し混乱しています。meltただし、単にしたいだけだと思いますdcast

library(reshape2)
d <- melt(allData,id.vars=c("user_id","video_id"), measure.vars=c("x","y"))
dcast(d,video_id~user_id+variable,value.var="value",fun.aggregate=mean)

その結果:

 video_id  1_x 1_y  2_x 2_y  3_x 3_y  4_x 4_y  5_x 5_y  6_x 6_y  7_x 7_y  8_x 8_y  9_x 9_y 10_x 10_y 11_x 11_y 12_x 12_y 14_x 14_y 15_x 15_y 16_x 16_y
1         0   39 108  899 132   61 357  149 298 1105 415  148 208  442 200  210 134   58 244  910  403  152   52 1092  617 1012  114 1105  424  548  394
2         1 1125  70  128 165 1151 390  171 587  623 623   80 643  866 310  994 114  854 129  781  306  672   -1 1096  354  525  524  150 
于 2012-12-19T13:57:19.540 に答える
3

Reduceトリックを行います:

reducedData <- Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)

names…しかし、後で修正する必要があります。

names(reducedData)[-1] <- do.call(function(...) paste(...,sep="."),expand.grid(letters[24:25],names(summaryList)))

結果は次のとおりです。

   video_id  x.1 y.1  x.2 y.2  x.3 y.3  x.4 y.4  x.5 y.5  x.6 y.6  x.7 y.7  x.8
1         0   39 108  899 132   61 357  149 298 1105 415  148 208  442 200  210
2         1 1125  70  128 165 1151 390  171 587  623 623   80 643  866 310  994
于 2012-12-19T13:59:46.003 に答える