我正在重写一些分析大量数据(大约1700万行)的R脚本,我想我会尝试使用data.table
包(我只是在学习!)来提高内存效率。复杂的汇总函数 - 是否可以使用R data.table包来解决?
代码的一部分一直令我困惑。我不能发布我的原始解决方案,因为(1)它是废话(慢!),和(2)关于数据非常细微,并且会使这个问题复杂化。
相反,我作出这个玩具例子(它确实是一个玩具为例):
ds <- data.table(ID=c(1,1,1,1,2,2,2,3,3,3),
Obs=c(1.5,2.5,0.0,1.25,1.45,1.5,2.5,0.0,1.25,1.45),
Pos=c(1,3,5,6,2,3,5,2,3,4))
,看起来像这样:
ID Obs Pos
1: 1 1.50 1
2: 1 2.50 3
3: 1 0.00 5
4: 1 1.25 6
5: 2 1.45 2
6: 2 1.50 3
7: 2 2.50 5
8: 3 0.00 2
9: 3 1.25 3
10: 3 1.45 4
为了便于说明,我会假装我们正在观测列车(每列列车都有自己的ID),在一个线性单程轨道上移动,并且观测(某些值,不是导入到问题中)列车正在设定的位置上进行(pos,在这里从1-6)沿着赛道。预计一列火车将不会使它成为整个轨道的长度(也许它在达到6的位置之前爆炸),并且有时观察者错过了一个观察结果......这些位置是连续的(因此如果我们错过了观察列车在位置4,但我们在位置5观察到它,我们知道它必须通过位置4)。
从上面data.table,我需要生成一个像这样的表:
Pos Count
1: 1 3
2: 2 3
3: 3 3
4: 4 3
5: 5 2
6: 6 1
如果为每一个独特波什我data.table DS,我有列车数的计数不管观察是否在赛道上的那个位置进行,这使得它位于赛道上(或更远)的那个位置。
如果任何人有任何想法或建议如何解决这个问题,将不胜感激。不幸的是,我对data.table不够熟悉,不知道这是否可以完成!或者它可能是难以置信的简单问题来解决,我只是缓慢:)
+1非常好的解决方案,甚至更好的解释。你可以说一些关于你如何期望这样比较的话:当数据变大时,ds [,list(Pos = 1:Pos [.N]),by = ID] [,.N,by = Pos]' –
@ SimonO'Hanlon不错的选择。 'Pos [.N]'将是一个新的长度为1的向量,传递给':'函数来创建一个新的'1:Pos [.N]'向量。我希望所有这些小型媒体都会堵塞内存并导致更多的垃圾收集。随着列车数量的增加,可能会增加(更多组)的数量,而不是增加的数量。如果你测试它,我对结果感兴趣! –
我不太了解data.table语法,但CJ看起来很贵(概念上,如果不是真的?);有没有类似我的解决方案,其中data.table通过ID标识最大Pos,即让我们快速访问'nAtMax'?也许这就是@ SimonO'Hanlon正在做什么? –