在R中以间隔删除相交区域

时间:2018-06-21 07:54:33

标签: r

如果我有间隔,如何找到和删除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中编写代码。

1 个答案:

答案 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应该具有偶数行,此解决方案才能起作用。