问题:给定一个原子向量,找到向量中连续元素的起始索引和结束索引。
具有连续元素的示例向量:
具有连续元素的示例向量:
x = rev(rep(6:10, 1:5))
# [1] 10 10 10 10 10 9 9 9 9 8 8 8 7 7 6
rle()
的输出:
rle(x)
# Run Length Encoding
# lengths: int [1:5] 5 4 3 2 1
# values : int [1:5] 10 9 8 7 6
期望的输出:
# start end
# 1 1 5
# 2 6 9
# 3 10 12
# 4 13 14
# 5 15 15
基础的rle
类似乎没有提供此功能,但是Rle
类和rle2
函数提供了这个功能。然而,考虑到这个功能并不重要,坚持使用基础R似乎比安装和加载其他软件包更明智。
有一些代码片段示例(这里,这里和在SO上),它们解决了寻找满足某些条件的运行的开始和结束索引的略微不同的问题。我想要的是更通用的东西,可以在一行中完成,并且不涉及分配临时变量或值。
回答自己的问题,因为我对搜索结果的缺乏感到沮丧。希望这可以帮助别人!
dplyr::lag
?在你的第二个解决方案中,你是不是想用select
代替extract
(来自tidyr
)?干杯 - Henrikbase
中,可以使用head(end,-1)
代替lag
。 - Henrikstats::lag
(我最近也遇到了dplyr
和stats
在lag
上的命名空间冲突问题,所以我理解你为什么会问!)。对于extract
,我指的是magrittr::extract
,它是一个支持前向管道操作符[
的函数。感谢您指出这些不明确之处,当时我没有意识到我在做什么! - Clarastats::lag
函数得到的结果与您展示的不同。(start <- c(1, stats::lag(end)[-1] + 1))
;[1] 1 10 13 15 16
。但是,使用dplyr::lag
函数可以得到您展示的结果:(start <- c(1, dplyr::lag(end)[-1] + 1))
;[1] 1 6 10 13 15
。祝好! - Henrikstart <- end - rle_x$lengths + 1
- qwr