Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 模拟需要很长时间,如何提高性能?_R_Performance_Loops_Dataframe_Markov Chains - Fatal编程技术网

R 模拟需要很长时间,如何提高性能?

R 模拟需要很长时间,如何提高性能?,r,performance,loops,dataframe,markov-chains,R,Performance,Loops,Dataframe,Markov Chains,我目前正在使用markovchain包和一个内环和一个外环进行markov链模拟。总的来说,应将17520万个值插入到数据框中,可复制的示例代码如下。这已经运行了40多个小时了,我想知道如何加快速度?我很好奇是否有人能告诉我完成计算需要多长时间 我已经通过使用profvis包改进了代码 library(markovchain) library(dplyr) library(expss) #States and creation of Markov transition matrix Loc

我目前正在使用
markovchain
包和一个内环和一个外环进行markov链模拟。总的来说,应将17520万个值插入到数据框中,可复制的示例代码如下。这已经运行了40多个小时了,我想知道如何加快速度?我很好奇是否有人能告诉我完成计算需要多长时间

我已经通过使用
profvis
包改进了代码

library(markovchain)
library(dplyr)
library(expss)



#States and creation of Markov transition matrix
Locations <- c("Home", "Bakery", "Grocery", "Home-Bakery", "Home-Grocery", "Bakery-Home", "Bakery-Grocery", "Grocery-Home", "Grocery-Bakery")

matrixExample <- matrix(sample(runif(81, min = 0 , max =1), replace = FALSE ), nrow = 9, ncol = 9)

matrixExample <- matrixExample / rowSums(matrixExample)
colnames(matrixExample) <- Locations
rownames(matrixExample) <- Locations

matrixExample <- as(matrixExample, "markovchain")


mcListLoop <- rep(list(matrixExample), 96)
mcList <- new("markovchainList", markovchains = mcListLoop)

z <- 10
numDays <- 365
k <- numDays * 96
battery <- 72.5

km <- runif(9, min = 5, max =120)
Locations <- c("Home", "Bakery", "Grocery", "Home-Bakery", "Home-Grocery", "Bakery-Home", "Bakery-Grocery", "Grocery-Home", "Grocery-Bakery")

averageDistance <- data.frame(cbind(Locations, km))
averageDistance$km <- as.numeric(averageDistance$km)


Iteration <- rep(seq(1:96), 365)

#Recreate dataframe
df <- data.frame(Iteration, sample(Locations, k, replace = TRUE))


df <- rmarkovchain(n=365, object = mcList, t0= "Home", include.t0 = TRUE)

#To estimate the size of list
allDf<- rep(list(df), z)


#Start of the loop
for(y in 1:z){

  df <- rmarkovchain(n=365, object = mcList, t0= "Home", include.t0 = TRUE)
  df$Begin <- 0
  df[1,3] <- battery
  df$Still <- ifelse(df$values == "Home", 1, 0)
  df$KM <- vlookup(df$values, averageDistance, lookup_column = 1, result_column = 2)
  df$Load <- ifelse(df$Still == 1, 2.75, 0)
  df$costDistance <- df$KM * 0.21
  df$End <- 0
  df[is.na(df)] <- 0
  df$reduce <- rep(seq(1:97), numDays)
  df <- df %>% filter(reduce != 97) 
  df$Load <- ifelse(df$reduce <= 69 | df$reduce >= 87, df$Load, 0)




            for(i in 1:k) {
      mainVector <- df[i,3]
      extra <- df[i,6]
      subtractingVector <- df[i,7]


      mainVector <- ifelse(mainVector < battery, pmin(mainVector + extra, battery),  mainVector )

      newMain <- mainVector - subtractingVector
      j <- i + 1
      df[j,3] <- newMain 
      }


allDf[[y]] <- df

}


库(markovchain)
图书馆(dplyr)
图书馆(expss)
#状态与马尔可夫转移矩阵的生成

位置您的代码似乎没有按预期运行,存在多个错误定义的变量和两个相同的循环。但我猜内部循环写得不好

如果您有一些带有充电/放电功能的
df

df <- data.table(charge = c(0, 0, 1, 2), discharge = c(1, 2, 0, 0))

df您的代码似乎没有按预期运行,存在多个错误定义的变量和两个相同的循环。但我猜内部循环写得不好

如果您有一些带有充电/放电功能的
df

df <- data.table(charge = c(0, 0, 1, 2), discharge = c(1, 2, 0, 0))

df如果您想匹配当前的计算,您可以用以下内容替换内循环:

  mainVector <- rep(0, nrow(df) + 1L) # pre-allocate resulting vector
  state <- battery # state at each iteration
  extra <- df[, 6]
  subtractingVector <- df[, 7]
  mainVector[1] <- state # add to resulting vector
  for (i in 1:k) {
    if (state < battery) state <- min(state + extra[i], battery)
    state <- state - subtractingVector[i]
    j <- i + 1L
    mainVector[j] <- state
  }
  df[nrow(df) + 1, ] <- NA # add NA row, so we can add longer vector to df
  df[, 3] <- mainVector

mainVector如果要匹配当前的计算结果,可以用以下内容替换内循环:

  mainVector <- rep(0, nrow(df) + 1L) # pre-allocate resulting vector
  state <- battery # state at each iteration
  extra <- df[, 6]
  subtractingVector <- df[, 7]
  mainVector[1] <- state # add to resulting vector
  for (i in 1:k) {
    if (state < battery) state <- min(state + extra[i], battery)
    state <- state - subtractingVector[i]
    j <- i + 1L
    mainVector[j] <- state
  }
  df[nrow(df) + 1, ] <- NA # add NA row, so we can add longer vector to df
  df[, 3] <- mainVector

mainVector一些变量仍然没有定义:)您编写的代码已经分析过了。为什么不在问题中显示分析输出?如果大部分时间都花在
rmarkovchain
上,那么除了并行化之外,您可能没有什么可以做的。定义了变量(进行了干净的运行),删除了双循环,并包含了profvis的图片。看起来很多时间都花在子集赋值、子集设置和
ifelse
上。首先,
ifelse
在有效代码中没有位置,而是使用子集赋值。然后,由于data.table的快速子集设置和快速就地赋值(使用
:=
操作符),您可能会从使用data.table中受益。当然,迭代data.frame的行是不好的,应该不惜一切代价避免(尝试使用矢量化,如果不能做到这一点,至少使用另一种数据结构,data.frame子集是slooow)。有些变量仍然没有定义:)您编写的代码已经分析过了。为什么不在问题中显示分析输出?如果大部分时间都花在
rmarkovchain
上,那么除了并行化之外,您可能没有什么可以做的。定义了变量(进行了干净的运行),删除了双循环,并包含了profvis的图片。看起来很多时间都花在子集赋值、子集设置和
ifelse
上。首先,
ifelse
在有效代码中没有位置,而是使用子集赋值。然后,由于data.table的快速子集设置和快速就地赋值(使用
:=
操作符),您可能会从使用data.table中受益。当然,迭代data.frame的行是不好的,应该不惜一切代价避免(尝试使用矢量化,如果不能做到这一点,至少使用另一种数据结构,data.frame子集是slooow)。