在大型数据集上使用 Dcast 函数 (reshape2)
Using the Dcast function (reshape2) on large dataset
我有一个尺寸为 (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 崩溃了。是否有更好的函数可以产生相同的输出但处理更大量的数据。如果这还不够信息,我可以私下向认为可以解决此问题的任何人提供完整的数据集(我无法在此处提供,因为 Whosebug 无法读取所有数据),因此您可以直接从资源。
任何帮助都会很棒,谢谢!
感谢@Imo 的建议,这是解决此问题的新解决方案:
如果您的数据集非常 large/wide,请将您的数据框转换为 data.table,然后从那里
library(data.table)
df1<-setDT(df)
new3$value<-1
trial<-dcast(new3, Source ~ Destination, fill = 0)
这将为您提供相同的结果并且可以处理大量数据
我有一个尺寸为 (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 崩溃了。是否有更好的函数可以产生相同的输出但处理更大量的数据。如果这还不够信息,我可以私下向认为可以解决此问题的任何人提供完整的数据集(我无法在此处提供,因为 Whosebug 无法读取所有数据),因此您可以直接从资源。
任何帮助都会很棒,谢谢!
感谢@Imo 的建议,这是解决此问题的新解决方案:
如果您的数据集非常 large/wide,请将您的数据框转换为 data.table,然后从那里
library(data.table)
df1<-setDT(df)
new3$value<-1
trial<-dcast(new3, Source ~ Destination, fill = 0)
这将为您提供相同的结果并且可以处理大量数据