我有一个染色体列表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
但这导致仅记录最后一次迭代。
有人可以建议我如何达到我想要的结果吗?
答案 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))