申请代替循环

时间:2017-04-20 20:11:03

标签: r for-loop apply

我正在尝试学习如何使用functionapply而不是for-loops,因为它可能需要更少的时间。任何人都可以给我建议如何更改以下代码,以减少花费的时间?

目标是让RFDates具有相同的属性,但使用相应的Euribor返回,而不是Dates中的“日期”。 EuriborDates中的日期为“序列号 - 日期”(类:数字)。

示例数据(此代码的输出与我的输入相似):

Dates=matrix(NA,4,10)
Dates[1,1:8]=seq(3610,3617,1)
Dates[2,1:10]=seq(3613,3622,1)
Dates[3,1:5]=seq(3615,3619,1)
Dates[4,1:7]=seq(3616,3622,1)

Euribor=matrix(0,2,51)
Euribor[1,]=seq(3600,3650,1)
Euribor[2,]=rnorm(51)

此解决方案返回正确的输出,但使用4500x4700矩阵需要很长时间。

RF = matrix(0,nrow(Dates),ncol(Dates))
for (i in 1:nrow(Dates)){
In=grep(Dates[i,1],Euribor[1,])
end=sum(!is.na(Dates[i,]))
RF[i,1:end]=as.matrix(Euribor[2,In:(In+end-1)])
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

Dates=matrix(NA,4,10)
Dates[1,1:8]=seq(3610,3617,1)
Dates[2,1:10]=seq(3613,3622,1)
Dates[3,1:5]=seq(3615,3619,1)
Dates[4,1:7]=seq(3616,3622,1)

Euribor=matrix(0,2,51)
Euribor[1,]=seq(3600,3650,1)
Euribor[2,]=rnorm(51)

RF = matrix(0,nrow(Dates),ncol(Dates))
for (i in 1:nrow(Dates)){
  In=grep(Dates[i,1],Euribor[1,])
  end=sum(!is.na(Dates[i,]))
  RF[i,1:end]=as.matrix(Euribor[2,In:(In+end-1)])
}

RF2 = matrix(Euribor[2,match(c(Dates), Euribor[1,])], nrow = nrow(Dates), ncol = ncol(Dates))

因此,RF2是快速实现此目的的方法,应与RF相同。

    > RF
           [,1]        [,2]       [,3]       [,4]       [,5]       [,6]       [,7]      [,8]       [,9]     [,10]
[1,] -0.0819133 -0.08336513  0.6926775  1.0500598 -0.5244457  1.1804117  1.7349849 1.3002456  0.0000000 0.0000000
[2,]  1.0500598 -0.52444574  1.1804117  1.7349849  1.3002456 -0.7438148 -1.2804350 0.9480801 -0.7692101 0.3189216
[3,]  1.1804117  1.73498487  1.3002456 -0.7438148 -1.2804350  0.0000000  0.0000000 0.0000000  0.0000000 0.0000000
[4,]  1.7349849  1.30024557 -0.7438148 -1.2804350  0.9480801 -0.7692101  0.3189216 0.0000000  0.0000000 0.0000000
> RF2
           [,1]        [,2]       [,3]       [,4]       [,5]       [,6]       [,7]      [,8]       [,9]     [,10]
[1,] -0.0819133 -0.08336513  0.6926775  1.0500598 -0.5244457  1.1804117  1.7349849 1.3002456         NA        NA
[2,]  1.0500598 -0.52444574  1.1804117  1.7349849  1.3002456 -0.7438148 -1.2804350 0.9480801 -0.7692101 0.3189216
[3,]  1.1804117  1.73498487  1.3002456 -0.7438148 -1.2804350         NA         NA        NA         NA        NA
[4,]  1.7349849  1.30024557 -0.7438148 -1.2804350  0.9480801 -0.7692101  0.3189216        NA         NA        NA

我们可以用这样的0替换NA

RF2[is.na(RF2)] = 0
> RF2
           [,1]        [,2]       [,3]       [,4]       [,5]       [,6]       [,7]      [,8]       [,9]     [,10]
[1,] -0.0819133 -0.08336513  0.6926775  1.0500598 -0.5244457  1.1804117  1.7349849 1.3002456  0.0000000 0.0000000
[2,]  1.0500598 -0.52444574  1.1804117  1.7349849  1.3002456 -0.7438148 -1.2804350 0.9480801 -0.7692101 0.3189216
[3,]  1.1804117  1.73498487  1.3002456 -0.7438148 -1.2804350  0.0000000  0.0000000 0.0000000  0.0000000 0.0000000
[4,]  1.7349849  1.30024557 -0.7438148 -1.2804350  0.9480801 -0.7692101  0.3189216 0.0000000  0.0000000 0.0000000

编辑: 我想我应该解释一下这是如何工作的。基本上我们需要的是Euribor中Date值的索引。我认为最简单的方法是将Date折叠到一个向量中,然后将日期值的位置匹配回Euribor并在匹配项中获取col 2中的值。

将向日志折叠到一个向量中,默认情况下矩阵也是如此,因此它会将其构造回我们正在寻找的形式。

最后,我们可以在最后换掉所有的NA,这部分非常简单。

由于我们已经删除了对for循环的需求,因此速度会快得多。我不确定我们如何在这里使用apply函数。可能有一种方法,但不需要加快速度。