【问题标题】:Determine sequence of consecutive numbers in R确定R中的连续数字序列
【发布时间】:2018-03-12 22:08:09
【问题描述】:

类似于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


    【解决方案1】:

    这就是你所追求的吗?

    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
    

    我在您的list 中没有看到24;是不是搞错了?

    如果您想排除只有一个数字的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
    

    【讨论】:

    • 完美运行。谢谢
    • 没问题@alex;很高兴它有帮助。
    【解决方案2】:

    请求的结果暗示您想丢弃被隔离的值:

    > 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
    

    【讨论】:

    • 这不是和我之前发的基本一样吗?
    • 当我查看您的答案时,您没有排除长度为 1 的项目。
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多