gpt4 book ai didi

r - 通过 R 中的数据子集执行计算

转载 作者:行者123 更新时间:2023-12-04 12:37:07 28 4
gpt4 key购买 nike

我想对我的数据框的 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,这两者我都不明白) .有什么建议?

最佳答案

正如 Joran 所建议的,我看图书馆data.table .对代码的修改是

library(data.table) 
companydataRETS <- data.table(companydataRETS)
setkey(companydataRETS,PERMNO)

rhos <- foreach (i=1:length(compns), .combine=rbind) %do%
get.rho(companydataRETS[J(compns[i])]$RET)

我按照最初的方式运行了代码(使用 subset )并且曾经使用过 data.table ,带有变量 compns仅包含数据集中 28659 家公司中的 30 家。以下是 system.time() 的输出对于两个版本:

使用 subset :

user........ system..... elapsed
43.925 ... 12.413...... 56.337



使用 data.table

user....... system..... elapsed
0.229..... 0.047....... 0.276



(出于某种原因,原始代码使用 %do% 而不是 %dopar% 使它运行得更快。 system.time()subset 是使用 %do% 的一个,在这种情况下两者中的更快。)

我让原始代码运行了一夜,5 个小时后它没有完成,所以我放弃并杀死了它。通过这个小小的修改,我在不到 5 分钟的时间内就得到了结果(我想大约需要 3 分钟)!

编辑

有一种更简单的方法可以使用 data.table ,不使用 foreach ,这涉及将上面代码的最后一行替换为
rhos <- companydataRETS[ , get.rho(RET), by=PERMNO]

关于r - 通过 R 中的数据子集执行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11210422/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com