繁体   English   中英

如何使循环更快?

[英]How to make the loop faster?

我的代码如下所示,我想知道是否有更好的方法让它更快:

pos=NULL
row=data.frame(matrix(nrow=216,ncol=4))
colnames(row)=c("sub","subi","group","trial")
for (i in 1:100000){
  row$sub="Positive"
  row$subi=NA
  row$group=NA
  row$subi[1:144]=c(1:144)
  row$group[1:144]=1
  row$subi[145:216]=c(1:72)
  row$group[145:216]=2
  row$trial=i
  pos=rbind(pos,row)
}

不需要循环。 您可以自己构建一个data.frametibble (我的示例)。

鉴于您想稍后调整行长:

library(dplyr)

n_rows <- 10000

tibble(
  trail = 1:n_rows,
  sub = "positive",
  subi = c(seq(1:144), seq(1:72), rep(NA, n_rows-216)),     
  group = c(rep(1, 144), rep(2, 72), rep(NA, n_rows-216))
  ) 

输出是:

# A tibble: 10,000 × 4
   trail sub       subi group
   <int> <chr>    <int> <dbl>
 1     1 positive     1     1
 2     2 positive     2     1
 3     3 positive     3     1
 4     4 positive     4     1
 5     5 positive     5     1
 6     6 positive     6     1
 7     7 positive     7     1
 8     8 positive     8     1
 9     9 positive     9     1
10    10 positive    10     1
# … with 9,990 more rows

看起来您正在尝试复制此数据帧 100,000 次,并且该帧的每次迭代都有不同的trial编号。

data.frame(sub = rep("Positive", 216), 
           subi = c(1:144, 1:72), 
           group = rep(c(1, 2), c(144, 72)))

replicate功能非常适合多次运行静态代码。 因此,一种选择是创建 100,000 个副本,然后更新试用号。

FrameList <- 
  replicate(n = 100, 
            {
              data.frame(sub = rep("Positive", 216), 
                         subi = c(1:144, 1:72), 
                         group = rep(c(1, 2), c(144, 72)), 
                         trial = rep(NA_real_, 216))
            }, 
            simplify = FALSE)

要更新试用号,您可以使用for循环

for (i in seq_along(FrameList)){
  FrameList$trial <- i
}

或者你可以尝试一些花哨的东西,但需要更多的代码

FrameList <- mapply(function(FL, i){
                      FL$trial <- i 
                      FL
                    },
                    FrameList, 
                    seq_along(FrameList), 
                    SIMPLIFY = FALSE)

无论你走哪条路,你都可以把它们堆在一起

Frame <- do.call("rbind", FrameList)

这当然不是最优雅的方法,所以请注意其他人会给你其他聪明的技巧。 但是,我猜想,这将是要遵循的基本过程。

循环的每次传递中唯一不同的是trial rep是你的朋友。 对于其他列,R 将自动回收以匹配最长的列(这里是trial 21.6M 行)。

pos <- data.frame(
  sub = "Positive",
  subi = c(1:144, 1:72),
  group = rep.int(1:2, c(144, 72)),
  trial = rep(1:1e5, each = 216)
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM