我在R中有一个涉及执行几行代码的模拟。 我想复制这个过程1000次。
如果没有for循环,有没有办法做到这一点?
我知道有replicate()但是一次只能复制1个进程。
以下是一个例子:
for (r in 1:reps){
first<-sapply(1:100, function(x) sample(c(1,2),100,prob=c(0.45,0.55),replace=T))
second<-sapply(2:100, function(i) length(which(apply(sapply(1:100, function(x) sample(easy[x,],i)),2,max)==2)) )
third[r,]<-second
}
这可以在没有for循环的情况下完成吗?
答案 0 :(得分:0)
正如我在评论中所提到的,这样的事情可以让你避免循环。
foo = function (dummy) {
first<-sapply(1:100, function(x) sample(c(1,2),100,prob=c(0.45,0.55),replace=T))
second<-sapply(2:100, function(i) length(which(apply(sapply(1:100, function(x) sample(easy[x,],i)),2,max)==2)) )
third[r,]<-second
}
sapply(1:reps, foo)
答案 1 :(得分:0)
命令replicate
对您有用(它实际上只是sapply
的包装,但使您的代码更具可读性)。我也让你的循环内部更具可读性:
set.seed(123)
for (r in 1:reps){
# first <- matrix(sample(c(1,2),100*100,prob=c(0.45,0.55),replace=T), nrow=100)
second <- sapply(2:100, function(i) length(which(apply(sapply(1:100, function(x) sample(easy[x,],i)),2,max)==2)) )
third[r,]<-second
}
set.seed(123)
third.2 <- t(replicate(reps, sapply(2:100, function(i)
sum(apply(easy[1:100, ], 1, function(x) max(sample(x, i))==2)))))
all.equal(third, third.2)
顺便说一下,即使你没有提出要求,但这是一种更快速的方法来计算first
,根本不需要sapply
。
set.seed(123)
first <- sapply(1:100, function(x) sample(c(1,2),100,prob=c(0.45,0.55),replace=T))
set.seed(123)
first.2 <- matrix(sample(c(1,2), 100*100, prob=c(0.45,0.55), replace=T), nrow=100)
all.equal(first, first.2)