我希望根据一系列数值变量(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但没有太大的成功 - 任何想法?
答案 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
,然后过滤,删除那些与自身重叠的行。然后按Min
和Max
分组行数。
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