我已经嵌套了for循环,如下所示。我需要p:q = 1:300,n = 20。功能“标记”是我感兴趣的模型(包RMark)。我知道rbind可能很慢,但我不知道应该用什么来代替它。否则我还能做些什么才能让这个功能更快?感谢。
foo<-function(data, p, q, n){
results.frame <- data.frame()
for (i in 1:n){
for (i in p:q) {
run.model<-mark(data[sample(nrow(data), i),], model="Occupancy")
results<-data.frame(summary(run.model)$real$p, Occupancy=summary(run.model)$real$Psi, se.p=t(as.matrix(summary(run.model, se=T)$real$p$se)), se.Psi=summary(run.model, se=T)$real$Psi$se, stations=i)
results.frame<-rbind(results.frame, results)
}
}
write.table(results.frame, "C:\\RWorkspace\\simulation_results.txt")
return(results.frame)
}
答案 0 :(得分:0)
是的,rbind
可能很慢;更快的事情通常是使矩阵的尺寸合适,并适当填充。填充矩阵而不是数据帧通常也更快。
然而,根据你指出的大小,我会怀疑mark
正在减慢功能的速度,你不会通过这样做得到明显的加速。通过在run.model
中存储单个结果,然后在循环中注释该行,可以很容易地测试它;这会告诉你它花了多少时间来存储结果。 (你也可以“分析”这个功能,但这会更简单。)
rbind
很可能导致问题。在我的系统上,它相当快且具有相当大的内存量,使用rbind
的数据帧需要7.73秒到n=20
,n=1
只需0.09秒,所以很明显一些内存搅动正在发生。至于加速,使用n=20
,rbind
矩阵只需1.00秒,填充它需要0.033秒。
foo <- function(data, p, q, n){
# make a single results line; remove this line when you put in your code
results <- c(1, Occupancy=2, se.p=3, se.Psi=4, stations=5)
# make the matrix the right size to start with
results.frame <- matrix(ncol=5, nrow=(q-p+1)*n)
for (i in 1:n){
for (j in p:q) {
# get results here; commented out to show loop speed only
# put in your actual code here instead
results.frame[ 1+(i-1)*(q-p+1)+(j-p), ] <- results
}
}
# get the names right by taking the names from the last time through the loop
colnames(results.frame) <- names(results)
results.frame
}