11

我有一个 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],从 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

提前感谢您的帮助。

4

2 回答 2

14

你需要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")

要了解更多信息(手动等),请访问此处

于 2013-03-05T23:07:29.247 回答
1

我认为这是可能的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]
于 2019-03-26T21:17:43.747 回答