【发布时间】:2021-05-30 07:51:04
【问题描述】:
我在下面创建了一个数据循环,它为我提供了我需要的结果。但是,处理时间很长。我需要分析大量数据(400,000 多个对象,最好是 25,000,000 多个),因此我很感兴趣是否有任何方法可以加快以下计算(数据片段):
我的数据框被称为:crsp.comp3
Permno Observation C.xsgaq C.xsgaq.depr
10026 1 45.145 44.393
10026 2 45.145 43.653
10026 3 45.145 42.925
10026 4 96.730 92.935
10026 5 96.730 91.386
10026 6 96.730 89.863
10026 7 145.511 136.333
10026 8 145.511 134.061
10026 9 145.511 131.827
10026 10 190.986 174.347
目前,我将“C.xsgaq.depr”列中的数字计算为:
for (i in 1:nrow(crsp.comp3)) {
if (crsp.comp3[i, 2] == 1) {
crsp.comp3[i, 4] <- crsp.comp3[i, 3]*(1 - (0.2/12))
} else {
crsp.comp3[i, 4] <- (crsp.comp3[i - 1, 4] +
(crsp.comp3[i, 3] - crsp.comp3[i - 1, 3]))*(1 - (0.2/12))
}
}
分配为“1”的观测值需要按上述计算,并且所有观测值 =/ 1 都需要按上述循环中的说明计算。我的目标是优化代码,以便更快地处理它。我听说过一些关于矢量化数据框的事情?
谢谢
【问题讨论】:
-
您之前曾发布过类似的数据,但尚未对某些查询作出回应。请检查
-
为什么不在循环中使用
ifelse函数而不是if ... else构造? -
何约翰,感谢您的回复!我对 R 很陌生,因此不熟悉这样的设置。如果使用“ifelse”函数,循环会如何?
-
只需将
if ... else ...替换为crsp.comp3[i, 4] <- ifelse (crsp.comp3[i, 2] == 1, crsp.comp3[i, 3]*(1 - (0.2/12)), (crsp.comp3[i - 1, 4] + (crsp.comp3[i, 3] - crsp.comp3[i - 1, 3]))*(1 - (0.2/12)))
标签: r performance dataframe loops vectorization