【问题标题】:Combine lists in forloop在 for 循环中组合列表
【发布时间】:2018-03-08 13:36:36
【问题描述】:

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

我首先通过迭代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

}

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

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

【问题讨论】:

    标签: r loops lapply


    【解决方案1】:

    您在结果中只看到最后一次迭代的原因是因为 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2018-10-08
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多