在没有for循环的情况下重复操作序列

时间:2014-05-16 06:30:29

标签: r

我在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循环的情况下完成吗?

2 个答案:

答案 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)