r - 查找开始和结束位置/运行索引/连续值

标签 r vector run-length-encoding

问题:给定一个原子向量,找到向量中运行的开始和结束索引。

带有运行的示例向量:

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 似乎比安装和加载额外的包更明智。

有一些代码片段示例( herehereon SO )解决了为满足某些条件的运行查找开始和结束索引的稍微不同的问题。我想要一些更通用的东西,可以在一行中执行,并且不涉及临时变量或值的分配。

回答我自己的问题,因为我对缺乏搜索结果感到沮丧。我希望这对某人有所帮助!

最佳答案

核心逻辑:

# Example vector and rle object
x = rev(rep(6:10, 1:5))
rle_x = rle(x)

# Compute endpoints of run
end = cumsum(rle_x$lengths)
start = c(1, lag(end)[-1] + 1)

# Display results
data.frame(start, end)
#   start end
# 1     1   5
# 2     6   9
# 3    10  12
# 4    13  14
# 5    15  15

Tidyverse/dplyr方式(以数据帧为中心):
library(dplyr)

rle(x) %>%
  unclass() %>%
  as.data.frame() %>%
  mutate(end = cumsum(lengths),
         start = c(1, dplyr::lag(end)[-1] + 1)) %>%
  magrittr::extract(c(1,2,4,3)) # To re-order start before end for display

因为startend向量与 values 的长度相同rle 的组件对象,解决识别满足某些条件的运行的端点的相关问题很简单:filter或子集 startend使用运行值条件的向量。

关于r - 查找开始和结束位置/运行索引/连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43875716/

相关文章:

r - 与Dplyr左连接,仅从另一个表中带来1个字段

递归函数和全局变量与局部变量

c++ - 使用就地新运算符堆栈展开破坏内存

c++ - 基于DCT的视频编码过程

r - 解析包含html的HTML(不间断空格)

r - 使用 'render_book' 时忽略输出选项 ('preamble' .tex' 被忽略)

c++ - std::unordered_set 是否连续(如 std::vector)?

c++ - 指向指针 vector 的指针数组

r - 获取向量中缺失值的运行长度

r - 从 real() 对象中减去最后 N 个值