如果我有间隔,如何找到和删除R中的交点。例如,如果我有:
start=c(5,9,1,2,14,18); end=c(10,12,3,4,16,20)
d<-cbind(start, end)
start end
5 10
9 12
1 3
2 4
14 16
18 20
我希望输出为
start end
5 8
11 12
1 1
4 4
14 16
18 20
例如,第一个间隔与第二个相交,则如果删除交集,则第一个间隔变为(5,8),第二个间隔变为(11,12),因为两个间隔都包含9和10,因此应将其删除。即测试区间是否存在任何交集,删除交集并返回带有新起点和终点的区间。我想知道如何在R中编写代码。
答案 0 :(得分:0)
这可能是您想要的:
start <- c(5, 9, 1, 2, 14, 18)
end <- c(10, 12, 3, 4, 16, 20)
d <- cbind(start, end)
# create temporary data frame
temp <- d
# i loops among 1, 2 and 3, because 3 is half the length of vector start
for(i in seq(length(start) / 2)) {
# both thisLine and nextLine will consider a pair of lines in the data frame
# thisLine loops among 1, 3 and 5
thisLine <- (2 * i) - 1
# nextLine loops among 2, 4 and 6
nextLine <- (2 * i)
# if there is an intersection: meaning that start of nextLine is bigger than
# the start of thisLine AND smaller than the end of thisline
if((temp[nextLine,]["start"]) > temp[thisLine,]["start"] &
(temp[nextLine,]["start"] < (temp[thisLine,]["end"]))) {
# get initial end of thisLine
initial_end_thisLine <- temp[thisLine,]["end"]
# set new value for end of thisLine to be the start of nextLine - 1
temp[thisLine,]["end"] <- temp[nextLine,]["start"] - 1
# set new value for start of nextline to be the initial end of thisLine
temp[nextLine,]["start"] <- initial_end_thisLine + 1
}
}
# get the output
output <- temp
请注意:
1-在R中使用for循环不是很好。我只想写一个解决方案的例子。更好地使用apply函数系列。
2-我了解您的问题,您只能比较每对线并寻找交叉点。如果您还想将所有行相互比较,则需要另一种解决方案。
3数据帧d应该具有偶数行,此解决方案才能起作用。