r - 在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]])
}
如果你有任何想法,那么你真的是奇迹创造者!!
解决方案
试试 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)
推荐阅读
- python - conda create -n anaconda 不会安装完整的 anaconda 软件包
- sorting - 堆索引示例说明
- assembly - 如何设置进位标志添加两个数字(32位)
- pyspark - Pyspark如何删除标点符号并在Rdd中制作小写字母?
- swift - 如何在 Xcode 9.4 中使 Optionals 可散列
- xamarin - 如何防止 xamarin 表单 ListView 项目重叠?
- c++ - tensorflow c_api.h 为什么GPU比CPU慢
- php - Laravel:如何仅在存在另一个特定字段时才使字段成为必需?
- java - 使用 Spring Boot 在 Hibernate-Validator 中重用域模型
- bash - “!”是什么意思?在`同时!数控...; 做...; 完成的意思