比较整体重叠与多个范围

时间:2017-02-07 19:17:46

标签: r algorithm

这是我的数据框

df = structure(list(A1 = c("0.01", "0.01", "0.01", "0.01", "0.01", 
"0.01"), A2 = c("0.01", "0.18", "0.31", "0.06", "1.71", "0.01"
), B1 = c("0.62", "3.68", "9.68", "1.70", "0.02", "0.01"), B2 = c("20.00", 
"20.00", "20.00", "20.00", "0.02", "20"), C1 = c("0.02", "5", 
"0.16", "0.01", "0.03", "0.01"), C2 = c("20.00", "20.00", "20.00", 
"20.00", "20.00", "20.00"), Min = c(0.02, 0.02, 0.02, 0.02, 0.02, 
0.02), Max = c(0.24, 0.24, 0.24, 0.24, 0.24, 0.24)), .Names = c("A1", 
"A2", "B1", "B2", "C1", "C2", "Min", "Max"), row.names = c(NA, 
6L), class = "data.frame")
  • A1 - A2定义第一个范围
  • B1 - B2定义第二个范围
  • C1 - C2定义第三个范围
  • Min - Max定义主要范围

我需要将A1-A2B1-B2C1-C2Min-Max进行比较。 如果有一个孔,则分配0.如果没有孔分配1。

例如,在第二行中,介于0.18和0.24之间(第二行为Max),A1-A2B1-B2C1-C2与{{1}重叠}。因此,分配0.如果可能,我还想提取0.18和0.24。对于所有其他行分配1.可以将值提取到矢量或新列。

这是一个解释范围内洞的意思的数字。

enter image description here

Min-MaxA2 >= A1B2 >= B1C2 >= C1始终为Max >= Min

2 个答案:

答案 0 :(得分:2)

最简单的情况是A1 <= A2,B1 <= B2,并且C1 <= C2。如果情况并非如此,那么你应该首先解决这个问题。

现在,如果您查看图片,A1,B1和C1中的一个(或多个)必须<=最小,A2,B2和C2中的一个(或多个)必须> =最大。如果没有,那么你的一端有一个洞。现在对于Min和Max之间的终点,它们必须在至少一个其他间隔内(或等于另一个间隔的边界点)或者存在间隙,例如, A2必须在B1和B2之间或C1和C2之间。 Min和Max之间的所有点都相同。

因此,只需检查6个边界点并检查A1,A2,B1,B2,C1和C2,看它们是否低于最小值,高于最大值,或者位于其他2个边界内。
然后检查A1,B1和C1中的所有三个都大于Max或A2,B2和C2中的所有三个都小于Min的特殊情况。如果满足上述所有条件(并且至少有一个间隔覆盖Min和Max),那么就没有孔。否则会有一个洞。

您可以使用一堆if-then语句测试上述内容。我不能想到任何更高效的东西(但其他人可能)。

答案 1 :(得分:2)

有一个库

library(intervals)

d <- sapply(df,as.numeric)
A <- Intervals(d[,1:2])
B <- Intervals(d[,3:4])
C <- Intervals(d[,5:6])
M <- Intervals(d[,7:8])

lapply(1:nrow(d),function(n) {
  interval_difference(M[n], interval_union(A[n],B[n],C[n]))
})

输出:

[[1]]
Object of class Intervals_full
0 intervals over R:


[[2]]
Object of class Intervals_full
1 interval over R:
(0.18, 0.24]

[[3]]
Object of class Intervals_full
0 intervals over R:


[[4]]
Object of class Intervals_full
0 intervals over R:


[[5]]
Object of class Intervals_full
0 intervals over R:


[[6]]
Object of class Intervals_full
0 intervals over R:
相关问题