r - R中for循环的替代方案?

标签 r code-coverage bioinformatics

我有 2 个文件,我想使用 R 组合它们。

head(bed)
chr8 41513235 41513282 ANK1.Exon1
chr8 41518973 41519092 ANK1.Exon2

第一个是给出间隔及其名称。
(染色体,从,到,名称)
head(coverage)
chr1 41513235 20
chr1 41513236 19
chr1 41513237 19

第二个是为单个基地提供保险。
(染色体、位置、覆盖率)

我现在想要在每个位置旁边写下每个外显子的名称。这将导致一些没有“外显子”的职位,我想在之后删除这些职位。

我想出了一种方法来做我想做的事。但是它需要 3 个 for 循环和大约 15 小时的计算时间。由于 for 循环不是 R 中的最佳实践,我想知道是否有人知道比以下更好的方法:
coverage <- cbind(coverage, "Exon")
coverage[,4] <- NA

for(i in 1:nrow(bed)){
 for(n in bed[i,2]:bed[i,3]{
  for(m in 1:nrow(coverage)){
   if(coverage[m,2]==n){
    file[m,4] <- bed[i,4]
   }
  }
 }
}

na.omit(coverage)

由于所有三个位置都位于区间“ANK1.Exon1”中,因此输出应如下所示:
head(coverage) 
chr1 41513235 20 ANK1.Exon1 
chr1 41513236 19 ANK1.Exon1 
chr1 41513237 19 ANK1.Exon1 

最佳答案

执行我正在寻找的最快方法是:

library("sqldf")
res <- sqldf("select * from coverage f1 inner join bed f2
on(f1.position >=f2.'from' and f1.position <=f2.'to')")

计算时间下降到秒。
为了获得如上所示的确切结果,进一步减少了数据框。
res <- cbind(res[1:4],res[8])

谢谢大家的帮助。

编辑:对于大型数据集,相同的位置可能出现在多个染色体中,进一步添加:
res <- sqldf("select * from coverage f1 inner join bed f2
on(f1.position >=f2.'from' and f1.position <=f2.'to' and f1.Chromosome = f2.Chromosome)")

关于r - R中for循环的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30320762/

相关文章:

testing - 主要项目代码覆盖率统计

c++ - 如何告诉 lcov 忽略源文件中的行

rmarkdown 错误 "attempt to use zero-length variable name"

r - 数据帧列表,但每个列表项都有 df 和另一个值,无法使用 bind_rows() 来组合它们

javascript - chrome 提取覆盖率报告作为构建过程的一部分

r - 合并具有多个值的列

python - fasta.gz 上的 SeqIO.parse

r - 通过基因 id 获取 SNP 列表的最佳方法?

r - 在 R 中实现算法 X

r - 从决策树中提取使用过的列名/特征