【发布时间】:2016-10-04 17:39:30
【问题描述】:
我的电脑是 Intel Core i7、12GB RAM 和 Windows 10,只是为了给你一些背景信息。我正在尝试对数据帧执行一个简单的操作,该数据帧大约有 41K entries 并且它在.csv 格式中的大小约为 20MB。
数据框有 4 列:
- 地址:因子变量,具有大约 41K 个不同级别(无重复级别)
- Block:Factor 变量,具有大约 39K 个不同的级别(大多数 Block 只有一个与其相关的地址,但其他最多有 100 个
- 能量:一个 int 变量
- 细分:因子变量,只有 7 个级别
让我给你看一下dataFrame的summary()输出:
Address Block ENERGY Segment
BAC0602532301: 1 A33093097: 165 Min. : 0 A :11863
BAC0603557493: 1 B79083796: 165 1st Qu.: 48590 A+ : 7723
BAC0604416292: 1 A08721177: 158 Median : 75420 A++ : 3948
BAE0602962660: 1 A46581666: 153 Mean : 144694 A+++: 2324
BAE0603336589: 1 B21053848: 138 3rd Qu.: 154167 B : 8110
BAI0602739803: 1 A08119687: 89 Max. :2802501 C : 4051
(Other) :40086 (Other) :39224 D : 2073
现在,我要执行的操作是对于每个 Block(大约有 39K)选择 ENERGY 列的最大值 和 地址 和 Segment 与此 ENERGY 相关。
所以要做到这一点,我知道有很多不同的选择。我通常尝试使用 plyr 或 dplyr 包中的函数,因为我认为它们比 Basic 包的其他选项更快,特别是如果操作可以被认为是 Split-Appy-Combine 操作。
问题是,如果我从 plyr 包中执行此操作:
ddply(dataFrame, "Block", summarize, AddressMax = Address[which.max(ENERGY)], SegmentMax = Segment[which.max(ENERGY)], EnergyMax = max(ENERGY))
计算机永远不会结束,我最终不得不杀死 R 程序
如果我从 dply 包中执行此操作:
Blocks <- group_by(DataFrame,Blocks)
MaxsbyBlock <- summarise(Blocks, AdressMax = Address[which.max(ENERGY)], SegmentMax = Segment[which.max(ENERGY)], EnergyMax = max(ENERGY))
完成大约需要 30 到 40 秒(至少完成!!!)。
否则,如果我放弃尝试使用 ddply 恢复地址,它会完美运行,事实上,如果您执行此操作(请注意,现在 AdressMax 已消失):
ddply(dataFrame, "Block", summarize,SegmentMax = Segment[which.max(ENERGY)], EnergyMax = max(ENERGY))
大约需要 3 到 4 秒才能完成。ddply 策略改进得更多。那么,有人可以告诉我,尝试使用 ddply 或 dply 包恢复 Adress Factor 变量的值有什么问题吗?如果您使用 __aggregate 函数并 merge 它会更快,我想至少了解一点原因:
aggdata<-aggregate(Energy~Blocks, data=dataFrame, max)
merge(aggdata,dataFrame,by.x=c('Blocks','Energy'),by.y=c('Blocks','Energy'))
【问题讨论】: