假设X是长度为100的向量,X位置为100个人。所有代理都从位置0开始
X <- rep(0,100)
但它们嵌入了一个有边界的词。我有一个函数,可以在给定时间随机更改所有代理的X位置。
Store <- X
X <- X + runif(100)
最终,一个代理人将到达边界,并且在那时,它将保持在限制范围内。使用循环遍历向量并使用if(伪代码)检查的最简单方法:
for (i in 1:length(X)) {
if (between the boundaries) {keep the new X[i]} else {assign X[i] the value in Store[i]}
}
这对于100个人是有用的,但是如果个体的数量(和向量的长度)增加,例如,对于100循环,for循环会增加太多的计算时间。
有更简单的方法吗?我在想,也许我可以在以下期间跳过超过阈值的特定值重新分配:
X <- X + runif(100)
编辑:另外,想象X不是矢量而是矩阵。
我意识到这个问题比较陈旧,但我只是有同样的问题,所以我不想让它没有答案。
通过将apply语句与min和max函数组合,可以以一种全面的方式将向量或矩阵限制在一定范围内的值,如下例所示。
# Create sample vector
X <- c(1:100); print(X)
# Create sample matrix
M <- matrix(c(1:100),nrow=10); print(M)
# Set limits
minV <- 15; maxV <- 85;
# Limit vector
sapply(X, function(y) min(max(y,minV),maxV))
# Limit matrix
apply(M, c(1, 2), function(x) min(max(x,minV),maxV))
有关应用功能的更多信息,我将参考R文档和R-Bloggers上的这篇文章:https://www.r-bloggers.com/using-apply-sapply-lapply-in-r/
当我第一次遇到应用语句时,我发现这是一个困难的概念,但我现在认为它是R最强大的功能之一。