【发布时间】:2012-06-26 15:11:47
【问题描述】:
我想对我的数据框PERMNO列中的每个公司编号执行计算,其摘要可以在这里看到:
> summary(companydataRETS)
PERMNO RET
Min. :10000 Min. :-0.971698
1st Qu.:32716 1st Qu.:-0.011905
Median :61735 Median : 0.000000
Mean :56788 Mean : 0.000799
3rd Qu.:80280 3rd Qu.: 0.010989
Max. :93436 Max. :19.000000
到目前为止,我的解决方案是创建一个包含所有可能的公司编号的变量
compns <- companydataRETS[!duplicated(companydataRETS[,"PERMNO"]),"PERMNO"]
然后使用一个使用并行计算的 foreach 循环,它调用我的函数 get.rho() 依次执行所需的计算
rhos <- foreach (i=1:length(compns), .combine=rbind) %dopar%
get.rho(subset(companydataRETS[,"RET"],companydataRETS$PERMNO == compns[i]))
我针对我的数据子集对其进行了测试,并且一切正常。问题是我有 7200 万次观察,即使让计算机通宵工作,它仍然没有完成。
我是 R 的新手,所以我想我的代码结构可以改进,并且有更好(更快,计算量更少)的方法来执行相同的任务(可能使用 apply 或 with,这两者我都没有'不懂)。有什么建议吗?
【问题讨论】:
-
强制注释引用data.table 包。
-
对您的主要问题没有很好的答案,但您的唯一公司名称列表可能更容易获得
unique(companydataRETS$PERMNO) -
@joran 我会看看 data.table 包。
-
@joran,我安装了 data.table 并修改了代码以使用它,system.time() 的结果从使用 foreach 的 (43.925 12.413 56.337) 减少到使用数据的 (0.229 0.047 0.276) 。桌子。太不可思议了!真的是我想要的。您认为您可以发布我的问题的答案吗?我可以稍后通过代码修改来完成它,但我想给你点...
-
对不起,我的意思是使用子集与 data.table。