为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

婷婷同学_ 2019-12-04 15:02:28
我有一个向量,例如c(1, 3, 4, 5, 9, 10, 17, 29, 30)和我想将“邻居”元素组合在一起,这些元素在一个衣衫agged的向量中形成一个规则的连续序列,结果是:L1:1L2:3,4,5L3:9,10L4:17L5: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)这是获得结果的极其无效的方法,因此欢迎任何更好的解决方案。
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

大量使用一些R惯用法:


> split(v, cumsum(c(1, diff(v) != 1)))

$`1`

[1] 1


$`2`

[1] 3 4 5


$`3`

[1]  9 10


$`4`

[1] 17


$`5`

[1] 29 30


查看完整回答
反对 回复 2019-12-04
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

约书亚(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  system elapsed 

#   2.64    0.00    2.64 


system.time( split(v, cumsum(c(TRUE, diff(v) != 1L))) ) # Modified code

# user  system elapsed 

# 1.09    0.00    1.12 


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 607 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信