【问题标题】:Pre-allocation and optimization loop预分配和优化循环
【发布时间】:2018-12-11 09:04:20
【问题描述】:

我的 R 脚本格式如下:

for (j in 1:N) {

                  #construct the DF2 data frame 
                  #operations on the DF2 data frame 
}

其中 N 可以很大(例如 100 万)。定义了 DF2 的列 一个接一个的用公式:

DF2$column_i <- function(x,f..) #or constant or ....

DF$column_i 可以是常量、函数或循环“while”。我尝试使用以下方法预先分配定义 DF2:

DF2 <- data.frame(matrix(nrow=..,ncol=..))

DF2$column_i 列之后进行计算,但我没有任何好处。

有人有什么想法吗?

【问题讨论】:

  • 如果您可以提供您正在计算的确切公式/代码,这可能会更容易。也许你根本不需要循环......
  • 在 R 中优化循环的最佳方法是避免它。如果您必须/想要使用循环,我宁愿使用foreach() %dopar%,尤其是用于构建 df/matricies
  • 我的代码在我的回答中。

标签: r for-loop dataframe optimization


【解决方案1】:

我的代码是这样的:

par <- data.frame(CA=runif(n = 50, min = 70000, max = 100000),
              D=round(runif(n = 50, min = 70, max = 90),0),
              P=runif(n = 50, min = 900, max = 20000),
              A=round(runif(n = 50, min = 50, max = 70),0))

parpa <- data.frame(matrix(nrow = nrow(par), ncol = 3*V))

comp <- function(CA, D, P, A){
vect <- rep('numeric', 3*V)

b <- 1
k <- 1 
while (((b+1) <= (D+1))&(k < V)) { 
a <- b+1
b <- min((a+8-1), (D+1))
vect[c(1+4*k, 2+4*k, 3+4*k, 4+4*k)] <- c(mean(DF2$Z[a:b]), sum(DF2$X[a:b]),
                                        mean(DF2$Q[a:b]), sum(DF2$AE[a:b]))
k <- k+1
}
return(vect)                       
}

#loop
for (j in 1:nrow(par)) {

CA <- par$CA[j] 
D <- par$D[j] 
R <- 0.01*D 
P <- par$P[j] 
A <- par$A[j]
COST <- 500    
V <- 5
#DF2
DF2 <- data.frame(M=0:D)
OB <- function(x) {
c <- COST*D*DF2$M/R
return(c)
}
DF2$O <- O(D)
DF2$E <- (D*DF2$M+2)/D*(D+4)
DF2$Q <- (CA-DF2$M)*D
DF2$X <- (CA-DF2$O)*(DF2$E+P)
Func <- function(x) {return(round(x/30, 2))}
DF2$Z[(A+2):(D+1)] <- sapply(DF2$E[(A+2):(D+1)], Func)

parpa[j,] <- comp(CA, D, P, A)
}

【讨论】:

  • 请通过编辑将其添加到您的主帖中。另外,V 和函数O 是什么?
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多