【问题标题】:Merge overlapping ranges into unique groups, in dataframe在数据框中将重叠范围合并为唯一组
【发布时间】:2013-02-20 13:31:35
【问题描述】:

我有一个 n 行和 3 行的数据框

df <- data.frame(start=c(178,400,983,1932,33653),
    end=c(5025,5025, 5535, 6918, 38197),
    group=c(1,1,2,2,3))

df
  start   end group
1   178  5025     1
2   400  5025     1
3   983  5535     2
4  1932  6918     2
5 33653 38197     3

我想创建一个新列df$group2,将重叠的组重新分类为相同的组。例如,df$group[df$group==1] 从 178 开始,到 5025 结束。这与 df$group[df$group==2] 重叠,df$group[df$group==2] 从 983 开始,到 6918 结束。我想创建一个新列,现在将组 1 和 2 分类为组 1(和随后,第 3 组作为第 2 组)。

结果:

df
  start   end group group2
1   178  5025     1      1
2   400  5025     1      1
3   983  5535     2      1
4  1932  6918     2      1
5 33653 38197     3      2

提前感谢您的帮助。

【问题讨论】:

    标签: r dataframe data.table range overlap


    【解决方案1】:

    你需要IRanges 包:

    require(IRanges)
    ir <- IRanges(df$start, df$end)
    df$group2 <- subjectHits(findOverlaps(ir, reduce(ir)))
    > df
    
    #  start   end group group2
    # 1   178  5025     1      1
    # 2   400  5025     1      1
    # 3   983  5535     2      1
    # 4  1932  6918     2      1
    # 5 33653 38197     3      2
    

    要安装 IRanges,请在 R 中键入以下行:

    source("http://bioconductor.org/biocLite.R")
    biocLite("IRanges")
    

    要了解更多信息(手册等),请转到here

    【讨论】:

    • 如果我们有另一个分组变量,这可以与 group_by() 语句相结合吗?
    【解决方案2】:

    我认为data.table::foverlaps 可以做到这一点:

    library(data.table)
    setDT(df)
    setkey(df,start,end)
    df[,row_id:=1:nrow(df)]
    
    temp <- foverlaps(df,df)
    temp[, `:=`(c("start","end"),list(min(start,i.start),max(end,i.end))),by=row_id]
    temp[, `:=`(c("start","end"),list(min(start,i.start),max(end,i.end))),by=i.row_id]
    temp2 <- temp[, list(group2=.GRP, row_id=unique(c(row_id,i.row_id))),by=.(start,end)][,.(row_id,group2)]
    
    setkey(df,row_id)
    setkey(temp2,row_id)
    temp2[df]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2021-05-19
      • 2010-10-12
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多