【问题标题】:Transform genomic regions to genomic positions in an R dataframe or GenomicRanges object将基因组区域转换为 R 数据框或 GenomicRanges 对象中的基因组位置
【发布时间】:2020-03-23 11:11:15
【问题描述】:

我有一个数据框,其中包含一些基因组区间及其在几个样本中的相应覆盖率:

       sample1   sample2   sample3
1:1-3    30        NA         NA
1:1-4    NA        40         35
1:4-5    35        NA         NA
1:5-7    NA        50         50
1:6-7    60        NA         NA 

我想获得相同的数据框,但用于基因组位置:

       sample1    sample2     sample3
1:1      30         40          35
1:2      30         40          35
1:3      30         40          35
1:4      35         40          35
1:5      35         50          50
1:6      60         50          50
1:7      60         50          50

你知道我怎样才能得到这个吗? (我也尝试过在 GenomicRanges 对象中转换数据框,但我仍然不知道该怎么做)

【问题讨论】:

    标签: r genomicranges


    【解决方案1】:

    我读到的你的数据:

    tab = structure(list(sample1 = c(30L, NA, 35L, NA, 60L), sample2 = c(NA, 
    40L, NA, 50L, NA), sample3 = c(NA, 35L, NA, 50L, NA)), class = "data.frame", row.names = c("1:1-3", 
    "1:1-4", "1:4-5", "1:5-7", "1:6-7"))
    

    这取决于您的数据集有多大,因此这是一个基于 GenomicRange 的解决方案:

    library(GenomicRanges)
    gr = GRanges(rownames(tab))
    seq_range = range(gr)
    W = width(seq_range)
    
    COV = lapply(tab,function(i){
      i[is.na(i)] = 0
      coverage(gr,weight=i,width=W)
    })
    
    cov_samples = sapply(COV,function(i)as.matrix(i[seq_range]))
    cov_samples
             sample1 sample2 sample3
    [1,]      30      40      35
    [2,]      30      40      35
    [3,]      30      40      35
    [4,]      35      40      35
    [5,]      35      50      50
    [6,]      60      50      50
    [7,]      60      50      50
    

    现在我们把它和坐标结合起来:

    final = data.frame(
    seqnames=rep(as.character(seqnames(seq_range)),W),
    pos =  unlist(lapply(W,seq,from=1)),
    cov_samples)
    
      seqnames pos sample1 sample2 sample3
    1        1   1      30      40      35
    2        1   2      30      40      35
    3        1   3      30      40      35
    4        1   4      35      40      35
    5        1   5      35      50      50
    6        1   6      60      50      50
    7        1   7      60      50      50
    

    【讨论】:

    • 是的,感谢您的回答,但问题不在于如何获取 Granges 对象,问题是如何获取从 1 到 7 的所有位置,而不是间隔。以及对于每个位置,如何获取每个样本对应的覆盖率值。
    • 确定@Jeni。我猜你有超过 1 个 seqnames。我在上面写了一些东西,它应该适用于超过 1 个 seqnames。
    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多