问题描述
我想在 .xts(带有一列的 ETRp)和向量之间创建此并行计算的循环。期待带有附加列的结果。
xts 文件是 ETRp
head(ETRp)
ETR[mm/day]
2020-11-01 00:00:00 0.007515922
2020-11-01 00:01:00 0.002171158
2020-11-01 00:02:00 0.005164759
2020-11-01 00:03:00 0.00495627
例如向量是:
SCF= c(1,2,3)
Ab= c(1,3)
我想应用的公式是这个。
EIp<- SCF*Ab*ETRp
所以尝试手动进行并行计算:
EIp<-SCF[1]*Ab[1]*ETRp
names(EIp)[1] <-"F1_1"
EIp$"F1_2"<-SCF[2]*Ab[2]*ETRp
EIp[,2]<-SCF[2]*Ab[2]*ETRp
EIp$"F1_3"<-SCF[3]*Ab[3]*ETRp
head(EIp)
F1_1 F1_2 F1_3
2020-11-01 00:00:00 0.007515922 0.007730099 0.010083984
2020-11-01 00:01:00 0.002111002 0.002171158 0.002832295
2020-11-01 00:02:00 0.003849464 0.003959160 0.005164759
2020-11-01 00:03:00 0.004956272 0.005097508 0.006649745
2020-11-01 00:04:00 0.006465297 0.006649535 0.008674379
2020-11-01 00:05:00 0.006972469 0.007171160 0.009354842
但是这样很费时间,
期待额外列的结果, 我尝试使用 FOR 循环,(下)
for(i in 1:3){
EIp[,i]<-SCF[i]*Ab[i]*ETRp
head(EIp)
ETR[mm/day]
2020-11-01 00:00:00 0.007515922
2020-11-01 00:01:00 0.002171158
2020-11-01 00:02:00 0.005164759
2020-11-01 00:03:00 0.004956272
2020-11-01 00:04:00 0.006649535
2020-11-01 00:05:00 0.009354842
但结果只显示一列。
简而言之,
这就是我想要的循环
F1_1 F1_2 F1_3
2020-11-01 00:00:00 0.007515922 0.007730099 0.010083984
2020-11-01 00:01:00 0.002111002 0.002171158 0.002832295
2020-11-01 00:02:00 0.003849464 0.003959160 0.005164759
2020-11-01 00:03:00 0.004956272 0.005097508 0.006649745
2020-11-01 00:04:00 0.006465297 0.006649535 0.008674379
2020-11-01 00:05:00 0.006972469 0.007171160 0.009354842
但是,这就是我得到的
head(EIp)
ETR[mm/day]
2020-11-01 00:00:00 0.007515922
2020-11-01 00:01:00 0.002171158
2020-11-01 00:02:00 0.005164759
2020-11-01 00:03:00 0.004956272
2020-11-01 00:04:00 0.006649535
2020-11-01 00:05:00 0.009354842
为什么我的结果中只有一列?
如何获得预期结果(1 列 XTS 和具有 3 个元素的向量)? 我希望它是 3 列(带有附加列) 你能帮我做这个 XTS 和向量计算吗?
解决方法
在 R 中使用 for 循环时,最好预先分配(创建)结果对象。然后在循环内用正确的值填充元素。
# setup example
library(xts)
data(sample_matrix)
ETRp <- as.xts(sample_matrix,dateFormat = "Date")[,"Close"]
SCF <- c(1,2,3)
Ab <- c(1,3)
SCF_Ab <- SCF * Ab
# create the result object
EIp <- matrix(NA,nrow = nrow(ETRp),ncol = length(SCF_Ab))
EIp <- xts(EIp,index(ETRp))
colnames(EIp) <- paste0("F1_",seq_along(SCF_Ab))
# fill in the results
for (i in seq_along(SCF_Ab)) {
EIp[,i] <- ETRp * SCF_Ab[i]
}
head(EIp)
## F1_1 F1_2 F1_3
## 2007-01-02 50.11778 200.4711 451.0600
## 2007-01-03 50.39767 201.5907 453.5790
## 2007-01-04 50.33236 201.3294 452.9912
## 2007-01-05 50.33459 201.3384 453.0114
## 2007-01-06 50.18112 200.7245 451.6301
## 2007-01-07 49.99185 199.9674 449.9267