确定R中连续数字的序列

3

在列表中查找连续数字组在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

毫无效果。

我相信我错过了一些显而易见的东西,并且会感激任何提示。

2个回答

5

您需要的是这个吗?

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,这是一个错误吗?

如果你想要排除列表中只有一个数字的条目,你可以在一行代码中实现:

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

完美运行。谢谢。 - frank
没问题 @alex;很高兴能帮到你。 - Maurits Evers

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

这不就是我之前发布的内容吗? - Maurits Evers
当我看了你的答案后,发现你没有排除长度为1的项目。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接