首页 > 解决方案 > 在R中没有for循环的迭代采样

问题描述

尽管我认为我遇到的问题可能很简单,但我仍然无法弄清楚。事情是这样的:

我有以下列表和向量。该列表用于填充向量:

probabilities = list(c(0.2, 0.3, 0.5), c(0.1, 0.1, 0.8), c(0.3,0.4,0.3))
nextState = c()

for(counter in 1:3){
nextState[counter] = sample(1:3, size = 1, prob = probabilities[[counter]])
}

代码工作正常。但是,当扩展到更大的列表(>10,000 个元素)时,循环变得非常缓慢。由于上面的循环在较大的代码中多次使用,因此消耗的时间太多了。有没有一种方法可以在不循环的情况下达到相同的结果?

附加问题:

谢谢你们,你们帮了大忙。另一个问题:如果概率和 nextState 是相互依赖的,我该如何避免 for 循环?也许有一些代码可以澄清:

M <- list(matrix(c(0.1, 0.2, 0.7, 0.2, 0.2, 0.6, 0.3, 0.3, 0.4), nrow = 3, ncol = 3), 
         matrix(c(0.3, 0.3, 0.4, 0.5, 0.5, 0, 0.1, 0.1, 0.8), nrow = 3, ncol = 3))

probabilities <- list()
nextState <- c(2, NA, NA)

for(i in 1:2){
probabilities[[i]] <- M[[i]][nextState[i], ]
nextState[i + 1] <- sample(1:3, size = 1, prob = probabilities[[i]])
}

如果你有任何想法,那么你真的是奇迹创造者!!

标签: r

解决方案


试试 sapply

nextstate <- sapply( probabilities, function(x) {sample(1:3, size = 1, prob = x)})

基准

# Unit: microseconds
#   expr      min       lq      mean    median       uq      max neval
#    for 2115.170 2223.475 2436.0797 2283.2755 2371.546 10048.64   100
# sapply   24.704   29.524  164.0261   37.3565   41.123 12763.03   100


microbenchmark::microbenchmark(
  `for` = { 
    nextState = c()
    for(counter in 1:3){
      nextState[counter] = sample(1:3, size = 1, prob = probabilities[[counter]])
    }
  },
  sapply = sapply( probabilities, function(x) {sample(1:3, size = 1, prob = x)}),
  times = 100)

推荐阅读