确定R中连续数字的序列

问题描述 投票:2回答:2

Finding groups of contiguous numbers in a listFind consecutive values in vector in R类似,区别在于我有一系列数字可能达到4,即

 y=c(4*1:4,24,31,33,39,4*16:20)
> y
 [1]  4  8 12 16 24 31 33 39 64 68 72 76 80

我想要一个函数来返回每个最大值为4的值序列,所以我得到:

4 8 12 16 # all sep by at most 4
31 33 # all sep by at most 4
64 68 72 76 80 # all sep by at most 4

我试过了:

st=c(1,which(diff(y)<5)+1)
en=c(st-1,length(y))
y[st]
[1]  4  8 12 16 33 68 72 76 80
y[en]
[1]  4  8 12 31 64 68 72 76 80

无济于事。

我确信我遗漏了一些显而易见的东西,并希望得到任何暗示。

r diff sequence
2个回答
2
投票

这就是你要追求的吗?

split(y, cumsum(c(0, diff(y) > 4)));
#$`0`
#[1]  4  8 12 16
#
#$`1`
#[1] 24
#
#$`2`
#[1] 31 33
#
#$`3`
#[1] 39
#
#$`4`
#[1] 64 68 72 76 80

我没有在你的24看到list;这是一个错误吗?

如果要仅使用一个数字排除list条目,则可以在一行中执行所有操作:

Filter(length, lapply(split(y, cumsum(c(0, diff(y) > 4))), function(x) x[length(x) > 1]));
#$`0`
#[1]  4  8 12 16
#
#$`2`
#[1] 31 33
#
#$`4`
#[1] 64 68 72 76 80

0
投票

请求的结果意味着您要丢弃隔离的值:

> seqs <- split(y, cumsum( c(0, diff(y)>4) ) ); seqs[ sapply( seqs, length) > 1 ]
$`0`
[1]  4  8 12 16

$`2`
[1] 31 33

$`4`
[1] 64 68 72 76 80
© www.soinside.com 2019 - 2024. All rights reserved.