我有一个向量,例如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
元芳怎么了
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
- 3 回答
- 0 关注
- 607 浏览
添加回答
举报
0/150
提交
取消