【问题标题】:R: Combine fragments below certain lengthR:组合低于一定长度的片段
【发布时间】:2014-10-27 06:03:44
【问题描述】:

我有一个包含小鼠基因组限制性片段的病床文件。每个片段都有不同的长度/宽度,如下所示:

chr   start     end   width
1 chr1       0 3000534 3000534
2 chr1 3000535 3000799     264
3 chr1 3000800 3001209     409
4 chr1 3001210 3001496     286
5 chr1 3001497 3002121     624

是否可以使用 R 将较短的片段(

chr   start     end   width
1 chr1       0 3000534 3000534
2 chr1 3000535 3001209     673    
3 chr1 3001210 3002121     910

注意,我不想过滤掉一定长度以下的片段,所以子设置数据不是一个选项。

我希望我的问题不会太令人困惑……

【问题讨论】:

  • @Jeanine 是否仅在相邻片段的宽度均小于 500 时才合并片段?在预期的结果中,第 3 行似乎并非如此。
  • @akrun。理想情况下,应该将每个
  • @Jeanine 谢谢,我之前没有发现最小片段大小
  • 12bp 宽的片段呢?
  • @Jeannine This post 可能会帮助您解决问题。我试过但不能直接应用这些方法。但是我确信它们可以以某种方式使用。 for-loop 在大型数据集上很容易但速度很慢(正如我想象的那样)。

标签: r


【解决方案1】:

这是第一个解决方案,假设 chr 保持不变,并且如果最后一个片段

mydata<-data.frame(chr=rep("chr1",6),start=c(0,3000535,3000800,3001210,3001497,3002122),end=c(3000534,3000799,3001209,3001496,3002121,3002134),width=c(3000534,264,409,286,624,12),stringsAsFactors=F)

i<-1
while(i<nrow(mydata)){
    if(mydata$width[i]>=500) {
        i<-i+1
    } else {
        mydata$end[i]<-mydata$end[i+1]
        mydata$width[i]<-sum(mydata$width[i:(i+1)])
        mydata<-mydata[-(i+1),]
    }
}
if(mydata$width[i]<500) mydata<-mydata[-i,]

【讨论】:

  • 您的代码有效,但仅适用于小数据帧。但是,我的数据框有 6x10^6 行,即使我把它分成更小的垃圾,它仍然需要很长时间......还有其他建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多