比较R中不均匀长度的矢量以找到不成对的部分

时间:2015-01-22 07:44:12

标签: r

我有两个不均匀长度的矢量。

> starts
[1]  1  4  7 11 13 15 18 20 37 41 53 61
> ends
[1]  3  6 10 17 19 35 52 60 63

startsends中的每个对应部分都应该形成边界,例如第一个(1, 3),第二个(4, 6)等等。但是你会注意到starts有10个元素,而ends只有9个。发生了什么异常,可能有连续的starts,例如starts(11,13,15)的第4到第6个元素都小于ends(17)的第4个元素。

修改:请注意,相应的ends并不总是比starts高1,上面的示例经过编辑以反映,即在ends 35之后,下一个{{1}是37。

我的问题是,如何找到所有这些不受欢迎的未配对starts?我的目标是将starts延长至与ends相同的长度,并将所有的startsstarts中的对应NA配对。实际矢量长度为数千,不匹配数百。我可以想象一个嵌套的ends循环来解决这个问题,但我想知道是否有更有效的解决方案。

编辑:预期结果为(for未更改,显示以供比较):

starts

或同等的,不特别关于格式。

2 个答案:

答案 0 :(得分:3)

> starts = c(1, 4, 7, 11, 15, 19, 23, 27)
> ends = c(3, 5, 14, 22, 25)
> e = ends[findInterval(starts, ends)+1]
> e
[1]  3  5 14 14 22 22 25 NA
> e[duplicated(e, fromLast=T)]=NA
> e
[1]  3  5 NA 14 NA 22 25 NA

findInterval似乎可以正常工作

答案 1 :(得分:2)

假设startsends都已排序,并且仅在缺少值的ends中进行排序,您可能会像以下一样直截了当地执行以下操作:< / p>

ends[c(match(starts, ends + 1)[-1], length(ends))]
#  [1]  3  6 10 NA 17 19 36 52 60 63