我有两个不均匀长度的矢量。
> 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
starts
和ends
中的每个对应部分都应该形成边界,例如第一个(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
相同的长度,并将所有的starts
与starts
中的对应NA
配对。实际矢量长度为数千,不匹配数百。我可以想象一个嵌套的ends
循环来解决这个问题,但我想知道是否有更有效的解决方案。
编辑:预期结果为(for
未更改,显示以供比较):
starts
或同等的,不特别关于格式。
答案 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)
假设starts
和ends
都已排序,并且仅在缺少值的ends
中进行排序,您可能会像以下一样直截了当地执行以下操作:< / p>
ends[c(match(starts, ends + 1)[-1], length(ends))]
# [1] 3 6 10 NA 17 19 36 52 60 63