2016-08-25 7 views
-2

に集約することで、私は次のように長い形式で行単位のトランザクション・データを持っているR再形成データ変数

TransactionId ItemCode 
101 123 
101 521 
102 423 
103 871 
103 982 
103 131 

私は1つの行に1つのトランザクション内のすべてのアイテムを取得するには、これを再構築したいです、ので、新しい形状変更の表は、私が溶融し、Rでキャストを試してみました

TransactionID ItemCode(s) 
101 123 521 
102 423 
103 871 982 131 

この(ワイド)のように見えますが、私は方法がどのように機能するかについて少し混乱しています。私のデータセットも巨大で、30万行もあります。このプロセスについてどうすればよいですか?

+0

出力テーブルが長方形ではありません。あなたはそれ以下のデータ(3つのカラムを持つ)に対してカラムが少なすぎます。 –

+0

@CyrusMohammadian私はトランザクションIDを編集しました。これはもっと明確にしたいことかもしれません。トランザクションにはさまざまなアイテムが含まれている可能性があるため、私の行は常に同じ数の出力を持つわけではありません。 – SuhrudL

+0

アイテムコードを別々の列または1つの列に入れたいのですが、1つの列にある場合は、それらを文字ベクタまたはセルごとのdata.frameとして使用しますか? – aichao

答えて

1

plyrパッケージを使用して、目的を達成することができます。データがproducts_sampleのデータフレーム内にあると仮定すると、tidyrパッケージのspreadddplyを使用できます。これにより、各TransactionIdの異なるItemCodesが異なる列に配置されます。あなたが提供されたデータを使用して

library(plyr) 
librray(tidyr) 
result <- ddply(products_sample, "TransactionId", spread, ItemCode, ItemCode) 

TransactionId ItemCode 
1   101  123 
2   101  521 
3   102  423 
4   103  871 
5   103  982 
6   103  123 

これは

print(result) 
## TransactionId 123 521 423 131 871 982 
##1   101 123 521 NA NA NA NA 
##2   102 NA NA 423 NA NA NA 
##3   103 NA NA NA 131 871 982 

ddplyへの最後の2つの引数がspreadに渡されkeyvalue引数です提供します。 keyは、値が列名として使用されるproducts_sampleの列を識別します。 valueは、値がproducts_sampleの列を識別し、その値がセルに入力されます。詳細は?spreadを参照してください。

+0

ありがとう!なぜあなたは 'ItemCode'を2回指定していますか? 'Error:行(1,2)の重複した識別子' – SuhrudL

+0

@SuhrudL:エラーメッセージの原因の1つは、 'TransactionId'をスプレッドのキーとして使用したことです。このスプレッド操作は、 'TransactionId'によってグループ化されたデータ、' ddply'の第2引数で実行されることを思い出してください。その結果、 'key'の識別子は' spread'のすべての行で同じになります。 – aichao