【问题标题】:Select rows in one table that comes from a range of two columns in another table using R使用R在一个表中选择来自另一个表中两列范围的行
【发布时间】:2016-01-13 15:58:05
【问题描述】:

仅当行位于“ref”表的区间内时,我才需要保存“map”中的行:

按照“地图”表的示例:

map<-"chr start tag depth BCV State
chr1 1 chr1-1 1 2 1
chr1 2 chr1-2 1 3 2
chr1 3 chr1-3 1 2 3
chr1 4 chr1-4 2 2 4
chr2 5 chr2-5 2 2 5
chr2 1 chr2-1 2 2 6
chr2 2 chr2-2 3 2 4
chr2 3 chr2-3 3 2 3
chr2 4 chr2-4 3 2 2
chr2 5 chr2-5 3 2 1
chr2 6 chr2-6 3 2 7
chr2 7 chr2-7 3 2 9
chr2 8 chr2-8 2 2 2
chr2 9 chr2-9 2 2 1"
map<-read.table(text=map,header=T)

我有一个类似这个例子的参考地图:

ref<-"chr start end
chr1 1 2 
chr1 2 3 
chr1 5 6 
chr2 7 9" 
ref<-read.table(text=ref,header=T)

我需要这样的决赛桌:

final<-"chr start tag depth BCV State
chr1 1 chr1-1 1 2 1
chr1 2 chr1-2 1 3 2
chr1 3 chr1-3 1 2 3
chr2 7 chr2-7 3 2 9
chr2 8 chr2-8 2 2 2
chr2 9 chr2-9 2 2 1"
final<-read.table(text=final,header=T)

【问题讨论】:

    标签: r merge data.table


    【解决方案1】:

    由于这是用data.table 标签标记的,这里有一个简单的data.table::forverlaps 解决方案

    setDT(map)[, end := start]
    setkey(setDT(ref))
    indx <- unique(foverlaps(map, ref, which = TRUE, nomatch = 0L)$xid)
    map[indx]
    #     chr start    tag depth BCV State end
    # 1: chr1     1 chr1-1     1   2     1   1
    # 2: chr1     2 chr1-2     1   3     2   2
    # 3: chr1     3 chr1-3     1   2     3   3
    # 4: chr2     7 chr2-7     3   2     9   7
    # 5: chr2     8 chr2-8     2   2     2   8
    # 6: chr2     9 chr2-9     2   2     1   9
    

    这基本上是在map 中添加一个end 列以关闭区间,key ref 数据集以定义foverlaps 的匹配区间,同时还包括chr .然后运行foverlaps,同时删除不匹配的值并选择unique重叠,以防ref中的间隔重叠。最后只是根据索引对map 进行子集化。

    【讨论】:

      【解决方案2】:

      首先,你需要扩大区间:

      L <- lapply(split(ref,ref$chr), function(d) unique(unlist(mapply(seq,d$start,d$end,SIMPLIFY = F))))
      

      这会给你:

      #$chr1
      #[1] 1 2 3 5 6
      
      #$chr2
      #[1] 7 8 9
      

      然后就可以合并了:

      ref2 <- setNames(stack(L),c('start','chr'))
      merge(map,ref2)
      

      最终输出:

      #   chr start    tag depth BCV State
      #1 chr1     1 chr1-1     1   2     1
      #2 chr1     2 chr1-2     1   3     2
      #3 chr1     3 chr1-3     1   2     3
      #4 chr2     7 chr2-7     3   2     9
      #5 chr2     8 chr2-8     2   2     2
      #6 chr2     9 chr2-9     2   2     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多