如何将向量分成规则的连续序列组?

我有一个向量,例如c(1, 3, 4, 5, 9, 10, 17, 29, 30)和我想将“邻居”元素组合在一起,这些元素在一个衣衫agged的向量中形成一个规则的连续序列,结果是:


L1:1

L2:3,4,5

L3:9,10

L4:17

L5:29,30


(前C程序员的)天真代码:


partition.neighbors <- function(v)

{

    result <<- list() #jagged array

    currentList <<- v[1] #current series


    for(i in 2:length(v))

    {

        if(v[i] - v [i-1] == 1)

        {

            currentList <<- c(currentList, v[i])

        }

        else

        {

            result <<- c(result, list(currentList))

            currentList <<- v[i] #next series

        }       

    }


    return(result)  

}

现在我知道


a)R不是C(尽管花括号)

b)全局变量是纯邪恶

c)这是获得结果的极其无效的方法


,因此欢迎任何更好的解决方案。


婷婷同学_
浏览 608回答 3
3回答

温温酱

大量使用一些R惯用法:> split(v, cumsum(c(1, diff(v) != 1)))$`1`[1] 1$`2`[1] 3 4 5$`3`[1]&nbsp; 9 10$`4`[1] 17$`5`[1] 29 30

元芳怎么了

约书亚(Joshua)和亚伦(Aaron)在现场。但是,通过谨慎使用正确的类型,整数和逻辑,它们的代码仍然可以达到两倍以上的速度:split(v, cumsum(c(TRUE, diff(v) != 1L)))v <- rep(c(1:5, 19), len = 1e6) # Huge vector...system.time( split(v, cumsum(c(1, diff(v) != 1))) ) # Joshua's code# user&nbsp; system elapsed&nbsp;#&nbsp; &nbsp;2.64&nbsp; &nbsp; 0.00&nbsp; &nbsp; 2.64&nbsp;system.time( split(v, cumsum(c(TRUE, diff(v) != 1L))) ) # Modified code# user&nbsp; system elapsed&nbsp;# 1.09&nbsp; &nbsp; 0.00&nbsp; &nbsp; 1.12&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP