在forloop中合并列表

fugu

我有一个chromosomes <- c(1:2, "X", "Y")要遍历的染色体列表,以便n为每个染色体生成随机数据时间chromosome

我首先通过遍历chromosomes并使用生成数据generateData(),然后将它们添加到列表中,然后使用以下方法将其合并到循环外的数据帧中来进行此操作bp_data <- as.data.frame(do.call(rbind, simByChrom))

chromosomes <- c(1:2, "X", "Y")
simByChrom <- list()

for (c in chromosomes){
  n <- sample(1:5,1)
  cat(paste("Simulating", n, "breakpoints on chromosome", c), "\n")
  bp_data <- generateData(c, n)
  simByChrom[[c]] <- bp_data
}

bp_data <- as.data.frame(do.call(rbind, simByChrom))
rownames(bp_data) <- NULL

# generate dummy data
generateData <- function(c, n){
  df <- data.frame(chrom = rep(c, n),
                    pos= sample(1:10000, n))
  return(df)
}

  chrom  pos
1     1 7545
2     2 5798
3     2 3863
4     3 4036
5     3 9347
6     3 4749 

我想对此进行多次遍历,并在中记录迭代次数bp_data$iteration,以生成如下所示的数据框:

chrom  pos  iteration
     1 7215 1
     1 4606 1
     2 8282 1
     2 3501 1
     2 4350 1
     2 6044 1
     X 2467 1
     Y 2816 1
     Y 8848 1
     Y 2304 1
     Y 4235 1
     1 3760 2
     1 8205 2
     1 4735 2
     2 3061 2
     X   56 2
     X 1722 2
     X 2430 2
     X 6749 2
     X 2081 2
     Y 9646 2

但是,我不确定如何执行此操作。我试过了:

iterations <- 2
for (i in (1:iterations)){
  cat("Running iteration", i, "\n")
  simByChrom <- list()

  for (c in chromosomes){
    n <- sample(1:5,1)
    cat(paste("Simulating", n, "breakpoints on chromosome", c), "\n")
    bp_data <- generateData(c, n)
    bp_data$iteration <- i
    simByChrom[[c]] <- bp_data

    # or 
    # simByChrom[[c]][[i]] <- bp_data

    # or 
    # simByChrom[[c]] <- bp_data
    # simByChrom[[c]]$iteration <- i
  }

  bp_data <- as.data.frame(do.call(rbind, simByChrom))
  rownames(bp_data) <- NULL

}

但这导致仅记录最后的迭代。

谁能建议我如何达到理想的结果?

93i7hdjb

您只看到结果中的最后一次迭代的原因是因为bp_data每次通过for循环都会被覆盖。您需要确保分别保存每个迭代结果,然后在最后将它们组合在一起。我相信只需对您已有的内容进行一些小的调整就可以解决问题:

iterations <- 2

#create empty list to store each iteration result
bp_data <- list()

#run each iteration
for (i in 1:iterations){
  cat("Running iteration", i, "\n")
  simByChrom <- list()

  for (c in chromosomes){
    n <- sample(1:5,1)
    cat(paste("Simulating", n, "breakpoints on chromosome", c), "\n")
    aa <- generateData(c, n)
    aa$iteration <- i
    simByChrom[[c]] <- aa
  }

  result <- as.data.frame(do.call(rbind, simByChrom))
  rownames(result) <- NULL
  bp_data[[i]] <- result
}

#combine each iteration into one data frame
final <- as.data.frame(do.call(rbind, bp_data))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章