2016-08-25 105 views
-2

我在下面的長格式逐行交易數據從長[R重塑數據來寬,聚集在一個變量

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

我要重塑這個讓所有項目在一個事務中的一行,因此,新的重塑表看起來像這樣(寬)

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

我試圖融化和R中鑄造,但我有點困惑的方法是如何工作的。另外我的數據集很大,有30M行。我應該如何去做這個過程?

+0

您的輸出表格不是矩形形式。你有太多的列相對於它下面的數據(其中有三列) –

+0

@CyrusMohammadian我編輯了事務ID,也許這使得我想做的更清楚。我的行不總是具有相同數量的輸出,因爲交易中可能有不定數量的項目。 – SuhrudL

+0

您是否希望將商品代碼放在單獨的列或一列中,並且如果在一列中,您希望將它們作爲字符矢量還是將其作爲每個單元格的data.frame? – aichao

回答

1

您可以使用plyr包完成您想要的。假設您的數據位於數據幀products_sample中,可以使用ddply與包中的spread。這將從每個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 

最後兩個參數ddplykeyvalue參數傳遞給spreadkey標識products_sample的值,其值將用作列名稱。 value標識products_sample的值,其值將填充單元格。詳情請參閱?spread

+0

謝謝!你爲什麼要指定'ItemCode'兩次?當我嘗試運行這個,我得到的錯誤:'錯誤:行重複標識符(1,2)' – SuhrudL

+0

@SuhrudL:您的錯誤信息的一個可能的原因是您使用'TransactionId'作爲傳播中的關鍵。回想一下,這個傳播操作是通過'TransactionId'分組的數據執行的,這是'ddply'中的第二個參數。因此,對於'spread'中的所有行,'key'的標識符都是相同的。 – aichao