我可以对此R代码做些什么来减少处理时间吗?

时间:2017-10-21 21:48:40

标签: r

我已编写下面的代码,但处理时间过长。处理一次运行大约需要40秒,似乎我需要超过5000轮才​​能获得合适质量的数据。

毫无疑问,有些时候是因为R方面的笨重编码。是否有人愿意看看这个并给我一些想法,让它更优雅,更快?

由于 亚伦

#THIS IS FOR MONTE CARLO ERF PROJECT

library(xlsx, openxlsx)

#number of loops

n <- 500

#number of years in files for run

years <- 99

#setup matrix for final data output

finaldata <- matrix(nrow = n, ncol = 8)

colnames(finaldata) <- c("kgno", "liveweight", "mark", "DSEdiff", "N2Oreudc", "limereduc", "C in char", "mit")


#kg of each gas per kg of global meat from ecoinvent.

CO2kg <- -3.887

N2Okg <- -3.51

CH4kg <- -7.02

otherkg <- -0.106

#this gets the baseline data from which production changes are added/subtracted

baseline <- read.csv("C:/Rfilesformonte/baseline.csv", header = FALSE)

baseline <- as.data.frame(baseline)

ptm <- proctime()

#loop through runs for analysis

for (i in 1:n)
  {

  ptm <- proc.time()
   ####PRODUCTION CHANGES#######

  #parameters 

  DSEewe <- 2.5

  liveweight <- runif(1, 15.0, 30.0) #this is liveweright per lamb at sale

  mark <- runif(1, 0.5, 1.2) #percentage marking rate

  basestock <- runif(1, 0.2, 0.24) #base stocking rate DSE ha

  newstock <- runif(1,0.3,0.48) #new dtocking rate DSE ha

  DSEdiff <- newstock - basestock

  Ewehabase <- basestock/DSEewe #stocking rate ewe ha for baseline

  Ewehanew <- newstock/DSEewe #stocking rate ewe ha for new

  #calculate production change where kgno is relative increase in liveweight

  kgno <- Ewehanew*mark*liveweight - Ewehabase*mark*liveweight

  ######N2O REDUCTIONS#######

  #parameters

  N2Opercreduc <- runif(1, 0.0, 0.5) #percentage reduction in N2O associated with biochar application

  N2Oha <- -0.475 #N2O per ha for wheat in NSW Vic slopes associated with fert use

  N2Oreduc <- N2Opercreduc*N2Oha #absolut value in N20 reduction

  #####LIME REDUCTIONS#####

  limeperreduc <- runif(1,0.0,100.0)

  limeha <- - 71.3 #CO2 emissions from lime use per ha from NSW Vic slopes

  limereduc <- limeperreduc*limeha

for (j in 2:years)

  {

  #year 1 has no production so not looped through

  CO2bcy1 <--2.05

  N2Obcy1 <- -0.0043

  CH4bcy1 <- -0.09173

  otherbcy1 <- 0.000635

  assign(paste0("CO2bcy",j), baseline[j,3] + CO2kg*kgno)

  assign(paste0("N2Obcy",j), baseline[j,4]+N2Okg*kgno)

  assign(paste0("CH4bcy",j), baseline[j,5]+CH4kg*kgno)

  assign(paste0("otherbcy", j), baseline[j,6] +otherkg*kgno)

}

#subtract avoided N2O emissions from year 2 of scenario when it is applied in YOung to wheat

   N2Obcy2 <- N2Obcy2 + N2Oreduc

   CO2bcy2 <- CO2bcy2 + limereduc

   CO2bcy3 <- CO2bcy3 + limereduc

   CO2bcy4 <- CO2bcy4 + limereduc

   CO2bcy5 <- CO2bcy5 + limereduc

   CO2bcy6 <- CO2bcy6 + limereduc

  #collate data

print("collating data")

  CO2data <- c(CO2bcy1, CO2bcy2,    CO2bcy3,    CO2bcy4,    CO2bcy5,    CO2bcy6,    CO2bcy7,    CO2bcy8,    CO2bcy9,    CO2bcy10,   CO2bcy11,   CO2bcy12,   CO2bcy13,   CO2bcy14,   CO2bcy15,   CO2bcy16,   CO2bcy17,   CO2bcy18,   CO2bcy19,   CO2bcy20,   CO2bcy21,   CO2bcy22,   CO2bcy23,   CO2bcy24,   CO2bcy25,   CO2bcy26,   CO2bcy27,   CO2bcy28,   CO2bcy29,   CO2bcy30,   CO2bcy31,   CO2bcy32,   CO2bcy33,   CO2bcy34,   CO2bcy35,   CO2bcy36,   CO2bcy37,   CO2bcy38,   CO2bcy39,   CO2bcy40,   CO2bcy41,   CO2bcy42,   CO2bcy43,   CO2bcy44,   CO2bcy45,   CO2bcy46,   CO2bcy47,   CO2bcy48,   CO2bcy49,   CO2bcy50,   CO2bcy51,   CO2bcy52,   CO2bcy53,   CO2bcy54,   CO2bcy55,   CO2bcy56,   CO2bcy57,   CO2bcy58,   CO2bcy59,   CO2bcy60,   CO2bcy61,   CO2bcy62,   CO2bcy63,   CO2bcy64,   CO2bcy65,   CO2bcy66,   CO2bcy67,   CO2bcy68,   CO2bcy69,   CO2bcy70,   CO2bcy71,   CO2bcy72,   CO2bcy73,   CO2bcy74,   CO2bcy75,   CO2bcy76,   CO2bcy77,   CO2bcy78,   CO2bcy79,   CO2bcy80,   CO2bcy81,   CO2bcy82,   CO2bcy83,   CO2bcy84,   CO2bcy85,   CO2bcy86,   CO2bcy87,   CO2bcy88,   CO2bcy89,   CO2bcy90,   CO2bcy91,   CO2bcy92,   CO2bcy93,   CO2bcy94,   CO2bcy95,   CO2bcy96,   CO2bcy97,   CO2bcy98,   CO2bcy99)

  N2Odata <- c(N2Obcy1, N2Obcy2,    N2Obcy3,    N2Obcy4,    N2Obcy5,    N2Obcy6,    N2Obcy7,    N2Obcy8,    N2Obcy9,    N2Obcy10,   N2Obcy11,   N2Obcy12,   N2Obcy13,   N2Obcy14,   N2Obcy15,   N2Obcy16,   N2Obcy17,   N2Obcy18,   N2Obcy19,   N2Obcy20,   N2Obcy21,   N2Obcy22,   N2Obcy23,   N2Obcy24,   N2Obcy25,   N2Obcy26,   N2Obcy27,   N2Obcy28,   N2Obcy29,   N2Obcy30,   N2Obcy31,   N2Obcy32,   N2Obcy33,   N2Obcy34,   N2Obcy35,   N2Obcy36,   N2Obcy37,   N2Obcy38,   N2Obcy39,   N2Obcy40,   N2Obcy41,   N2Obcy42,   N2Obcy43,   N2Obcy44,   N2Obcy45,   N2Obcy46,   N2Obcy47,   N2Obcy48,   N2Obcy49,   N2Obcy50,   N2Obcy51,   N2Obcy52,   N2Obcy53,   N2Obcy54,   N2Obcy55,   N2Obcy56,   N2Obcy57,   N2Obcy58,   N2Obcy59,   N2Obcy60,   N2Obcy61,   N2Obcy62,   N2Obcy63,   N2Obcy64,   N2Obcy65,   N2Obcy66,   N2Obcy67,   N2Obcy68,   N2Obcy69,   N2Obcy70,   N2Obcy71,   N2Obcy72,   N2Obcy73,   N2Obcy74,   N2Obcy75,   N2Obcy76,   N2Obcy77,   N2Obcy78,   N2Obcy79,   N2Obcy80,   N2Obcy81,   N2Obcy82,   N2Obcy83,   N2Obcy84,   N2Obcy85,   N2Obcy86,   N2Obcy87,   N2Obcy88,   N2Obcy89,   N2Obcy90,   N2Obcy91,   N2Obcy92,   N2Obcy93,   N2Obcy94,   N2Obcy95,   N2Obcy96,   N2Obcy97,   N2Obcy98,   N2Obcy99)

  CH4data <- c(CH4bcy1, CH4bcy2,    CH4bcy3,    CH4bcy4,    CH4bcy5,    CH4bcy6,    CH4bcy7,    CH4bcy8,    CH4bcy9,    CH4bcy10,   CH4bcy11,   CH4bcy12,   CH4bcy13,   CH4bcy14,   CH4bcy15,   CH4bcy16,   CH4bcy17,   CH4bcy18,   CH4bcy19,   CH4bcy20,   CH4bcy21,   CH4bcy22,   CH4bcy23,   CH4bcy24,   CH4bcy25,   CH4bcy26,   CH4bcy27,   CH4bcy28,   CH4bcy29,   CH4bcy30,   CH4bcy31,   CH4bcy32,   CH4bcy33,   CH4bcy34,   CH4bcy35,   CH4bcy36,   CH4bcy37,   CH4bcy38,   CH4bcy39,   CH4bcy40,   CH4bcy41,   CH4bcy42,   CH4bcy43,   CH4bcy44,   CH4bcy45,   CH4bcy46,   CH4bcy47,   CH4bcy48,   CH4bcy49,   CH4bcy50,   CH4bcy51,   CH4bcy52,   CH4bcy53,   CH4bcy54,   CH4bcy55,   CH4bcy56,   CH4bcy57,   CH4bcy58,   CH4bcy59,   CH4bcy60,   CH4bcy61,   CH4bcy62,   CH4bcy63,   CH4bcy64,   CH4bcy65,   CH4bcy66,   CH4bcy67,   CH4bcy68,   CH4bcy69,   CH4bcy70,   CH4bcy71,   CH4bcy72,   CH4bcy73,   CH4bcy74,   CH4bcy75,   CH4bcy76,   CH4bcy77,   CH4bcy78,   CH4bcy79,   CH4bcy80,   CH4bcy81,   CH4bcy82,   CH4bcy83,   CH4bcy84,   CH4bcy85,   CH4bcy86,   CH4bcy87,   CH4bcy88,   CH4bcy89,   CH4bcy90,   CH4bcy91,   CH4bcy92,   CH4bcy93,   CH4bcy94,   CH4bcy95,   CH4bcy96,   CH4bcy97,   CH4bcy98,   CH4bcy99)

  otherdata <- c(otherbcy1, otherbcy2,  otherbcy3,  otherbcy4,  otherbcy5,  otherbcy6,  otherbcy7,  otherbcy8,  otherbcy9,  otherbcy10, otherbcy11, otherbcy12, otherbcy13, otherbcy14, otherbcy15, otherbcy16, otherbcy17, otherbcy18, otherbcy19, otherbcy20, otherbcy21, otherbcy22, otherbcy23, otherbcy24, otherbcy25, otherbcy26, otherbcy27, otherbcy28, otherbcy29, otherbcy30, otherbcy31, otherbcy32, otherbcy33, otherbcy34, otherbcy35, otherbcy36, otherbcy37, otherbcy38, otherbcy39, otherbcy40, otherbcy41, otherbcy42, otherbcy43, otherbcy44, otherbcy45, otherbcy46, otherbcy47, otherbcy48, otherbcy49, otherbcy50, otherbcy51, otherbcy52, otherbcy53, otherbcy54, otherbcy55, otherbcy56, otherbcy57, otherbcy58, otherbcy59, otherbcy60, otherbcy61, otherbcy62, otherbcy63, otherbcy64, otherbcy65, otherbcy66, otherbcy67, otherbcy68, otherbcy69, otherbcy70, otherbcy71, otherbcy72, otherbcy73, otherbcy74, otherbcy75, otherbcy76, otherbcy77, otherbcy78, otherbcy79, otherbcy80, otherbcy81, otherbcy82, otherbcy83, otherbcy84, otherbcy85, otherbcy86, otherbcy87, otherbcy88, otherbcy89, otherbcy90, otherbcy91, otherbcy92, otherbcy93, otherbcy94, otherbcy95, otherbcy96, otherbcy97, otherbcy98, otherbcy99)

  #aggregate data into data frame and save

  inputdata <- cbind(CO2data,N2Odata,CH4data,otherdata)

  inputdata <- as.data.frame(inputdata)

  write.xlsx(inputdata, "C:/Rfilesformonte/Input.xlsx", sheetName="Sheet1", 
  col.names=FALSE, row.names=FALSE, append=FALSE, showNA=TRUE)

  print("running shell")

  shell("C:\\Rfilesformonte\\Monte.vbs", mustWork = FALSE) 

  #Sys.sleep(1)

  import <- read.csv("C:/Rfilesformonte/AD emissions calculations for R.csv")

  import$Biochar <- as.numeric(import$Biochar)

  finaldata[i, 1] <- kgno

  finaldata[i, 2] <- liveweight

  finaldata[i, 3] <- mark

  finaldata[i, 4] <- DSEdiff

  finaldata[i, 5] <- N2Oreduc

  finaldata[i, 6] <- limereduc

  finaldata[i, 7] <- -1.03 #Need to actually calculate this and take from a spreadsheet

  finaldata[i, 8] <- import[99,4]

  print(paste("run", i, "of", n, "complete"))

  time <- proc.time() - ptm

  print(time)

  }

str(finaldata)

finaldata

0 个答案:

没有答案