我正在尝试学习如何使用function
和apply
而不是for-loops,因为它可能需要更少的时间。任何人都可以给我建议如何更改以下代码,以减少花费的时间?
目标是让RF
在Dates
具有相同的属性,但使用相应的Euribor
返回,而不是Dates
中的“日期”。 Euribor
和Dates
中的日期为“序列号 - 日期”(类:数字)。
示例数据(此代码的输出与我的输入相似):
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)])
}
提前感谢您的帮助。
答案 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函数。可能有一种方法,但不需要加快速度。