r语言 - 将数字向量拆分为其包含的自然序列的函数



我有一个如下的向量:

example <- c(1, 2, 3, 8, 10, 11)

我正试图写一个函数,返回一个输出作为一个你会得到:

desired_output <- list(first_sequence = c(1, 2, 3), 
second_sequence = 8, 
third_sequence = c(10, 11)
)

实际上,我想要的是计算向量中有多少个序列,以及每个序列的长度。它只是碰巧一个列表在" desired_output "就足够了。

最后是构造另一个向量,我们称它为"b",它包含以下内容:

b <- c(3, 3, 3, 1, 2, 2)

这背后的现实问题是测量三维点云中包含的三维物体的高度。

我已经尝试编程一个函数,返回列表"example_list"而一个直接输出向量"b"的递归函数,没有成功。

有人知道吗?非常感谢。

我们可以通过相邻元素的diff序列创建一个分组来分割成一个list

out <- split(example, cumsum(c(TRUE, abs(diff(example)) != 1)))

得到lengthsrep酸盐

unname(rep(lengths(out), lengths(out)))
[1] 3 3 3 1 2 2

你可以这样做:

out <- split(example, example - seq_along(example))

获取长度:

ln <- unname(lengths(out))
rep(ln, ln)
[1] 3 3 3 1 2 2

还有一个。虽然不优雅,但却是一种不同的方法:

  1. 创建示例向量的数据帧
  2. 将元素分配给组
  3. 聚合tapply
example_df <- data.frame(example = example)
example_df$group <- cumsum(ifelse(c(1, diff(example) - 1), 1, 0))
tapply(example_df$example, example_df$group, function(x) x)
$`1`
[1] 1 2 3
$`2`
[1] 8
$`3`
[1] 10 11

另一个选择是使用ave:

ave(example, cumsum(c(1, diff(example) != 1)), FUN = length)
# [1] 3 3 3 1 2 2
#or just 
ave(example, example - seq(example), FUN = length)

相关内容

  • 没有找到相关文章

最新更新