在大型数据集

时间:2016-08-31 16:33:38

标签: r dplyr reshape2 dcast

我有一个尺寸为(325,928 x 2)的数据框。

以下是该数据的一小部分:

Destination = c('A60001', 'A60001','A60001','A60001','A60001','A60001','A60001','A60001',
            'A60001','A60001','A60001','A60001','A60001','A60001','A60001','A60001',
            'A60001','A60001','A60001','A60001','A60001','A60001','A60001','A60001',
            'A60001', 'A60002', 'A60002','A60002','A60002','A60003')
Source = c('AA53', 'AA582', 'AA18', 'AA388', 'AA841', 'AA72', 'AA19', 'AA77', 'AA78', 'AA20', 'AA21',
       'AA12', 'AA412', 'AA634', 'AA591', 'AA859', 'AA157', 'AA254', 'AA167', 'AA176',
       'AA428', 'AA538', 'AA268', 'AA196', 'AA1250', 'AA23', 'AA16', 'AA692', 'AA196',
       'AA22')

df = data.frame(Destination, Source)

> df
   Destination Source
1       A60001   AA53
2       A60001  AA582
3       A60001   AA18
4       A60001  AA388
5       A60001  AA841
6       A60001   AA72
7       A60001   AA19
8       A60001   AA77
9       A60001   AA78
10      A60001   AA20
11      A60001   AA21
12      A60001   AA12
13      A60001  AA412
14      A60001  AA634
15      A60001  AA591
16      A60001  AA859
17      A60001  AA157
18      A60001  AA254
19      A60001  AA167
20      A60001  AA176
21      A60001  AA428
22      A60001  AA538
23      A60001  AA268
24      A60001  AA196
25      A60001 AA1250
26      A60002   AA23
27      A60002   AA16
28      A60002  AA692
29      A60002  AA196
30      A60003   AA22

此处的最终目标是使用与dcast类似的内容将此数据帧转换为新的数据帧,因为dcast无法处理大量数据。

所以这是我尝试使用此数据帧的原始代码:

test<-dcast(cbind(df,V1 = rep(1,nrow(df))),`Source` ~ Destination,value.var='V1',fun.aggregate = length)

输出:

   Source A60001 A60002 A60003
1    AA12      1      0      0
2  AA1250      1      0      0
3   AA157      1      0      0
4    AA16      0      1      0
5   AA167      1      0      0
6   AA176      1      0      0
7    AA18      1      0      0
8    AA19      1      0      0
9   AA196      1      1      0
10   AA20      1      0      0
11   AA21      1      0      0
12   AA22      0      0      1
13   AA23      0      1      0
14  AA254      1      0      0
15  AA268      1      0      0
16  AA388      1      0      0
17  AA412      1      0      0
18  AA428      1      0      0
19   AA53      1      0      0
20  AA538      1      0      0
21  AA582      1      0      0
22  AA591      1      0      0
23  AA634      1      0      0
24  AA692      0      1      0
25   AA72      1      0      0
26   AA77      1      0      0
27   AA78      1      0      0
28  AA841      1      0      0
29  AA859      1      0      0

它适用于我提供的数据集但是当我使用维度的完整数据集测试它时:325,928 x 2,R崩溃了。是否有更好的功能可以产生相同的输出但处理更大量的数据。如果这不是足够的信息,我可以私下提供完整的数据集给任何认为可以解决这个问题的人(我不能在这里提供它,因为StackOverflow无法读取所有数据)所以你可以测试从源头直接解决问题。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

感谢@Imo建议,这是解决此问题的新解决方案:

如果您的数据集非常大/宽,请将您的数据框转换为data.table然后从那里

library(data.table)
df1<-setDT(df)
new3$value<-1
trial<-dcast(new3, Source ~ Destination, fill = 0)

这将为您提供相同的结果,并且可以处理大量数据