我有一个如下的向量:
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)))
得到lengths
和rep
酸盐
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
还有一个。虽然不优雅,但却是一种不同的方法:
- 创建示例向量的数据帧
- 将元素分配给组
- 聚合
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)