假设我有以下数据:
c(1:4,7:15,20:23,25,30:35,40,41)
我想从该向量中获取开始和结束范围。然而,我想跳过没有自然前驱和后继的单个值(在示例中:25)。换句话说,应该至少有两个连续的值来构成一个“范围”。本例中的起始范围是:
1, 7, 20, 30, 40
它们对应的结束范围是:4, 15, 23, 35, 41
有没有优雅的内置解决方案?我几乎陷入了 for 循环 hell 。
最佳答案
确定地点 diff(x)
是 > 1,通过添加 TRUE
适本地滞后到序列的开头或结尾。 ( diff(x)
生成的向量比 x
短一个元素。) &
子句摆脱了单例值。
dx1 <- c(TRUE,diff(x)>1)
dx2 <- c(diff(x)>1, TRUE)
start <- x[dx1 & !dx2]
end <- x[dx2 & !dx1]
可能还有一个类似 rle(diff(x)==1)
的解决方案,但它会比上面的解决方案复杂一些(例如,如果您想识别特定长度的运行,它可能会很有用)。
关于r - 从包含间隙的序列中获取开始和结束范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68702354/