如何在 R 中将向量分解为连续的组

Ale*_*lex 2 r

我很好奇是否有一种功能方法可以分解 R 中连续组的向量。

例如,如果我有以下内容

# start with this
vec <- c(1,2,3,4,6,7,8,30,31,32)

# end with this
vec_vec <- list(c(1, 2, 3, 4),c(6,7,8),c(30,31,32))
print(vec_vec[1])
Run Code Online (Sandbox Code Playgroud)

我只能想象这可以通过 for 循环来计算先前值的差异,但也许有更好的方法来解决这个问题。

Gre*_*gor 7

split(vec, vec - seq_along(vec)) |> unname()
# [[1]]
# [1] 1 2 3 4
# 
# [[2]]
# [1] 6 7 8
# 
# [[3]]
# [1] 30 31 32
Run Code Online (Sandbox Code Playgroud)

减法seq_along(vec)将连续序列转换为单个值,我们可以split这样做。


G. *_*eck 5

1)折叠包有 seqid:

library(collapse)
split(vec, seqid(vec))
Run Code Online (Sandbox Code Playgroud)

给予:

$`1`
[1] 1 2 3 4

$`2`
[1] 6 7 8

$`3`
[1] 30 31 32
Run Code Online (Sandbox Code Playgroud)

2)给出相同答案的基本方法是

split(vec, cumsum(c(TRUE, diff(vec) != 1)))
Run Code Online (Sandbox Code Playgroud)

3)在cgwtools的评论中seqle建议。

library(cgwtools)
lens <- seqle(vec)$lengths
split(vec, rep(seq_along(lens), lens))
Run Code Online (Sandbox Code Playgroud)