Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 查找开始和结束位置/运行索引/连续值_R_Vector_Run Length Encoding - Fatal编程技术网

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

R 查找开始和结束位置/运行索引/连续值,r,vector,run-length-encoding,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()输出: 期望输出: # start end # 1 1 5 # 2 6 9 # 3 10 12 # 4 13 14 # 5 15 15 基本rle类似乎不提供此功能,但类和函数提供此功能。然而,考虑到功能

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

带有运行的向量示例:

x = rev(rep(6:10, 1:5))
# [1] 10 10 10 10 10  9  9  9  9  8  8  8  7  7  6
rle()
输出:

期望输出:

#   start end
# 1     1   5
# 2     6   9
# 3    10  12
# 4    13  14
# 5    15  15
基本
rle
类似乎不提供此功能,但类和函数提供此功能。然而,考虑到功能是多么的微小,坚持使用BaseR似乎比安装和加载额外的软件包更明智

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

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

核心逻辑:

# 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
way(以数据帧为中心):


因为
开始
结束
向量的长度与
rle
对象的
组件的长度相同,解决为满足某些条件的运行识别端点的相关问题很简单:
过滤
或使用运行值上的条件对
开始
结束
向量进行子集。

A
数据。表
可能性,其中
.I
.N
用于选择相关指数,由
rleid
运行定义的每组

library(data.table)
data.table(x)[ , .(start = .I[1], end = .I[.N]), by = rleid(x)][, rleid := NULL][]
#    start end
# 1:     1   5
# 2:     6   9
# 3:    10  12
# 4:    13  14
# 5:    15  15

嗨,克拉拉!我在运行你的代码时遇到一些问题。在第一个解决方案中,您是指
dplyr::lag
?在第二种解决方案中,您的意思是
选择
而不是
提取
(从
tidyr
?)?谢谢如果您想将第一个解决方案保留在
base
,您可以使用
head(end,-1)
而不是
lag
@Henrik问得好!我的意思是
stats::lag
(我最近还遇到了
dplyr
stats
lag
上的名称空间冲突问题,所以请理解为什么要问这个问题!)。对于
extract
,我的意思是
magrittr::extract
,这是
[
操作符的一个前向管道友好函数。感谢你说出这些歧义,我当时还没有意识到我在做什么!感谢你对
stats::lag
的回复@Clara!我得到的结果与你显示的结果不同。
(也可在无延迟的情况下启动:
启动
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
library(data.table)
data.table(x)[ , .(start = .I[1], end = .I[.N]), by = rleid(x)][, rleid := NULL][]
#    start end
# 1:     1   5
# 2:     6   9
# 3:    10  12
# 4:    13  14
# 5:    15  15