优化R代码和mapply()函数的用法

时间:2018-07-08 08:44:14

标签: r loops for-loop optimization mapply

我有一个大数据集的脚本(循环中的大j)。我已经删除了一些周期,但我认为可以再次对其进行优化。我尝试了foreach()函数,但它给了我一些错误。我不知道如何并行化以及是否有必要。该脚本将数据帧par []作为输入,并且对于每个记录(其中包含一些用于计算的参数),它必须创建一个新记录:parpa []。它必须首先进行计算,为此,在循环内部建立了DF2数据帧。最后,通过while循环计算perpa []中包含的值。第一个问题:有人有优化的想法吗?我使用了mapply(),但它返回错误。

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)
O <- 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)] <- unlist(sapply(DF2$E[(A+2):(D+1)], Func))

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

----------------------------- with mapply()-------------- ---------------------

#loop
outputpa <- function(CA, D, P, A) {

CA <- par$CA 
D <- par$D 
R <- 0.01*D 
P <- par$P 
A <- par$A
COST <- 500    
V <- 5
#DF2
DF2 <- data.frame(M=0:D)
O <- 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)] <- unlist(sapply(DF2$E[(A+2):(D+1)], Func))
}

parpa <- mapply(outputpa, par$CA, par$D, par$P, par$A)

0 个答案:

没有答案