我有一個向量,例如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 關注
- 657 瀏覽
添加回答
舉報
0/150
提交
取消