我有 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/