在forloop中组合列表

时间:2018-03-08 13:36:37

标签: r loops lapply

我有一个染色体列表chromosomes <- c(1:2, "X", "Y"),我正在迭代为每个n生成随机数据chromosome次。

我首先通过遍历chromosomes并使用generateData()生成数据,然后将这些数据添加到列表中然后使用{{1将其组合到循环外部的数据框中}}:

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

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

有人可以建议我如何达到我想要的结果吗?

1 个答案:

答案 0 :(得分:1)

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

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