这是我的数据框
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-A2
,B1-B2
,C1-C2
与Min-Max
进行比较。
如果有一个孔,则分配0.如果没有孔分配1。
例如,在第二行中,介于0.18和0.24之间(第二行为Max
),A1-A2
,B1-B2
或C1-C2
与{{1}重叠}。因此,分配0.如果可能,我还想提取0.18和0.24。对于所有其他行分配1.可以将值提取到矢量或新列。
这是一个解释范围内洞的意思的数字。
Min-Max
,A2 >= A1
,B2 >= B1
和C2 >= C1
始终为Max >= Min
答案 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: