为非常大的数据集生成smmary表

时间:2015-02-27 09:45:27

标签: r data.table

我正在处理迁移数据,我想从一个非常大的数据集(> 400万)中生成三个汇总表。其中一个例子详述如下:

migration <- structure(list(area.old = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
                                                   2L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("leeds", 
                                                                                                                   "london", "plymouth"), class = "factor"), area.new = structure(c(7L, 
                                                                                                                                                                                    13L, 3L, 2L, 4L, 7L, 6L, 7L, 6L, 13L, 5L, 8L, 7L, 11L, 12L, 9L, 
                                                                                                                                                                                    1L, 10L, 11L), .Label = c("bath", "bristol", "cambridge", "glasgow", 
                                                                                                                                                                                                              "harrogate", "leeds", "london", "manchester", "newcastle", "oxford", 
                                                                                                                                                                                                              "plymouth", "poole", "york"), class = "factor"), persons = c(6L, 
                                                                                                                                                                                                                                                                           3L, 2L, 5L, 6L, 7L, 8L, 4L, 5L, 6L, 3L, 4L, 1L, 1L, 2L, 3L, 4L, 
                                                                                                                                                                                                                                                                           9L, 4L)), .Names = c("area.old", "area.new", "persons"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                        -19L))

摘要表1:&#39; area.within&#39;

我想要创建的第一个表格叫做“area.within&#39;”。这将仅详细说明人们在同一区域内移动的区域(即,它将计算在&#39; area.old&#39;和&#39;中记录下来的人员总数。 ; area.new&#39)。数据表中可能会出现多次这种情况。然后它会针对所有不同的区域执行此操作,因此摘要将为:

      area.within persons
1      london      13
2       leeds       5
3    plymouth       5

使用数据表包,我有:

setDT(migration)[as.character(area.old)==as.character(area.new)]

......但这并没有摆脱重复...

摘要表2:&#39; move.from&#39;

第二个表格将总结经历过人们迁出的区域(即&area; old.old&#39;中的那些独特值)。它将识别第1列和第2列不同的区域,并将所有详细的人员(即排除在区域之间移动的人员 - 在摘要表1中)加在一起。结果表应为:

      moved.from persons
1     london      24
2      leeds      17
3   plymouth      19

摘要表3:&#39; move.to&#39;

第三个表格总结了人们迁移到哪些区域(即&area; new.new&#39;中的那些独特值)。它将识别第1列和第2列不同的所有唯一区域,并将所有详细的人员(即排除在区域之间移动的人员 - 在汇总表1中)加在一起。结果表应为:

     moved.to persons
1      london       5
2        york       3
3   cambridge       2
4     bristol       5
5     glasgow       6
6       leeds       8
7        york       6
8   harrogate       3
9  manchester       4
10   plymouth       0
11      poole       2
12  newcastle       3
13       bath       4
14     oxford       9

最重要的是,表2和表3中详述的所有人的总和应该相同。然后,该值与表1中的总人数相结合,应该等于原始表中所有人的总和。

如果有人可以帮我解决如何使用数据表包构建我的代码来生成我的表,我将非常感激。

1 个答案:

答案 0 :(得分:0)

我认为使用data.table是一个不错的选择。

setDT(migration) #This has to be done only once

1

为避免重复,请按城市按以下方式对其进行总结

migration[as.character(area.old)==as.character(area.new), 
                 .(persons = sum(persons)), 
                 by=.(area.within = area.new)]

2

这与1. one非常相似,但在 i -Argument

中使用!=
migration[as.character(area.old)!=as.character(area.new), 
                 .(persons = sum(persons)), 
                 by=.(moved.from = area.old)]

3

与2相同。

migration[as.character(area.old)!=as.character(area.new), 
                 .(persons = sum(persons)), 
                 by=.(moved.to = area.new)]

<强>替代 由于2.和3.非常相似,你也可以这样做:

moved <- migration[as.character(area.old)!=as.character(area.new)]
#2
moved[,.(persons = sum(persons)), by=.(moved.from = area.old)]
#3
moved[,.(persons = sum(persons)), by=.(moved.to = area.new)]

因此,只有选择了正确的行才能完成。