2016-08-25 37 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