r - 提取向量中的第一个连续序列

标签 r indexing continuous

我有一个向量:

as <- c(1,2,3,4,5,9)

我需要提取向量中的第一个连续序列,从索引 1 开始,输出如下:

1 2 3 4 5

是否有这样做的智能功能,或者我必须做一些不那么优雅的事情:

a <- c(1,2,3,4,5,9)
is_continunous <- c()
for (i in 1:length(a)) {
  if(a[i+1] - a[i] == 1) {
    is_continunous <- c(is_continunous, i)
  } else {
    break
  }
}

continunous_numbers <- c()
if(is_continunous[1] == 1) {
  is_continunous <- c(is_continunous, length(is_continunous)+1)
  continunous_numbers <- a[is_continunous]
}

它可以解决问题,但我希望有一个函数可以做到这一点。

最佳答案

不清楚如果连续序列的索引仅从索引 1 或第一个序列开始,无论起始索引是什么。

在这两种情况下,您都需要从检查相邻元素之间的差异开始:

d_as <- diff(as)

如果您只需要从索引 1 开始的第一个序列:

if(d_as[1]==1) 1:(rle(d_as)$lengths[1]+1) else NULL
# [1] 1 2 3 4 5

rle 允许知道相同值的每个连续序列的长度和值。

如果您需要第一个连续序列,无论起始索引是什么:

rle_d_as <- rle(d_as)
which(d_as==1)[1]+(0:(rle_d_as$lengths[rle_d_as$values==1][1]))

示例(第二个选项):

as <- c(1,2,3,4,5,9) 
d_as <- diff(as)
rle_d_as <- rle(d_as)
which(d_as==1)[1]+(0:(rle_d_as$lengths[rle_d_as$values==1][1]))
#[1] 1 2 3 4 5

as <- c(4,3,1,2,3,4,5,9)
d_as <- diff(as)
rle_d_as <- rle(d_as)
which(d_as==1)[1]+(0:(rle_d_as$lengths[rle_d_as$values==1][1]))
# [1] 3 4 5 6 7

as <- c(1, 2, 3, 6, 7, 8)
d_as <- diff(as)
rle_d_as <- rle(d_as)
which(d_as==1)[1]+(0:(rle_d_as$lengths[rle_d_as$values==1][1]))
# [1] 1 2 3

关于r - 提取向量中的第一个连续序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074387/

相关文章:

mysql - Solr:从 MySQL 持续迁移

python - 检查列表的n个成员是否在python中的另一个列表中

python - 离散到连续时间传递函数

r - 连续渐变颜色和固定比例热图 ggplot2

r - 在R中将一列分成n级列

ruby - 在 Ruby 中,获取数组中最大值索引的最简洁方法是什么?

c# - 数据库索引碎片 : Sequential GUID saved as String works fine but not saved as GUID

r - 根据字符串值汇总数据框

r - 帧()错误: figure margins too large

r - 更改 R 中的内部因子水平(对于避风港很重要 - write_dta())