单个数据帧中的重叠范围

时间:2016-10-19 10:58:06

标签: r

我希望根据一系列数值变量(Min,Max)标记我的df中具有重叠范围的行(看起来创建重叠列),如果需要,我可以将其转换为整数:

Class    Min  Max
    A    100  200
    A    120  205
    A    210  310
    A    500  630
    A    510  530
    A    705  800

转换为:

Class    Min  Max  Overlap
    A    100  200        1
    A    120  205        1
    A    210  310        0
    A    500  630        1
    A    510  530        1
    A    705  800        0

我尝试过IRanges但没有太大的成功 - 任何想法?

3 个答案:

答案 0 :(得分:2)

我发现data.table对于使用foverlaps

进行重叠非常有效
 library(data.table)
 library(dplyr)

重新创建数据:

dt <- data.table(Class = c("A", "A", "A", "A", "A", "A"),
           Min = c(100, 120, 210, 500, 510, 705),
           Max = c(200, 205, 310, 630, 530, 800))

键入data.table,这是函数所必需的:

setkey(dt, Min, Max)

这里我们对自己做foverlaps,然后过滤,删除那些与自身重叠的行。然后按MinMax分组行数。

dt_overlaps <- foverlaps(dt, dt, type = "any")[Min != i.Min & Max != i.Max, .(Class, Overlap = .N), by = c("Min", "Max")]

感谢DavidArenburg

dt[dt_overlaps, Overlap := 1]

结果:

> dt
  Class Min Max Overlap
1     A 100 200       1
2     A 120 205       1
3     A 210 310      NA
4     A 500 630       1
5     A 510 530       1
6     A 705 800      NA

可能有更简洁的data.table代码,但我也在学习。

答案 1 :(得分:2)

outer是我快速进行成对比较的首选功能。您可以使用outer创建间隔端点的成对比较,然后以您想要的任何方式组合比较。在这种情况下,我检查重叠所需的两个规则是否同时保持为真。

library(dplyr)

df_foo = read.table(
textConnection("Class    Min  Max
A    100  200
A    120  205
A    210  310
A    500  630
A    510  530
A    705  800"), header = TRUE
)

c = outer(df_foo$Max, df_foo$Min, ">")
d = outer(df_foo$Min, df_foo$Max, "<")

df_foo %>% 
  mutate(Overlap = apply(c & d, 1, sum) > 1 
)

答案 2 :(得分:0)

library(dplyr)
df_foo%>%mutate(flag=coalesce(ifelse(Max>lead(Min),1,NA),ifelse(lag(Max)>Min,1,NA)))
  Class Min Max flag
1     A 100 200    1
2     A 120 205    1
3     A 210 310   NA
4     A 500 630    1
5     A 510 530    1
6     A 705 800   NA