索引障碍的分区序列
partition sequence by barriers of indices
给定一个序列s <- 10:1
,base R
中是否有任何优雅的函数允许您为s
的索引设置障碍以划分s
?
例如,如果barriers <- c(3,7)
,这意味着分离发生在s
中的第3和第7个位置,这样所需的输出应该是一个分区列表,如
> list(10:8,7:4,3:1)
[[1]]
[1] 10 9 8
[[2]]
[1] 7 6 5 4
[[3]]
[1] 3 2 1
请注意,如果 barriers <- c(3,10)
,由于第 10 个位置的屏障之外的分区没有任何剩余,因此所需的输出应为
> list(10:8,7:1)
[[1]]
[1] 10 9 8
[[2]]
[1] 7 6 5 4 3 2 1
解决方案:感谢@RonakShah和@GKi
提供的线索
split(s, findInterval(seq_along(s), barriers, left.open = TRUE))
您可以像这样使用 split
和 findInterval
:
s <- 10:1
barriers <- c(3,7)
split(s, findInterval(seq_along(s), barriers, left.open = TRUE))
#$`0`
#[1] 10 9 8
#
#$`1`
#[1] 7 6 5 4
#
#$`2`
#[1] 3 2 1
barriers <- c(3,10)
split(s, findInterval(seq_along(s), barriers, left.open = TRUE))
#$`0`
#[1] 10 9 8
#
#$`1`
#[1] 7 6 5 4 3 2 1
给定一个序列s <- 10:1
,base R
中是否有任何优雅的函数允许您为s
的索引设置障碍以划分s
?
例如,如果barriers <- c(3,7)
,这意味着分离发生在s
中的第3和第7个位置,这样所需的输出应该是一个分区列表,如
> list(10:8,7:4,3:1)
[[1]]
[1] 10 9 8
[[2]]
[1] 7 6 5 4
[[3]]
[1] 3 2 1
请注意,如果 barriers <- c(3,10)
,由于第 10 个位置的屏障之外的分区没有任何剩余,因此所需的输出应为
> list(10:8,7:1)
[[1]]
[1] 10 9 8
[[2]]
[1] 7 6 5 4 3 2 1
解决方案:感谢@RonakShah和@GKi
提供的线索split(s, findInterval(seq_along(s), barriers, left.open = TRUE))
您可以像这样使用 split
和 findInterval
:
s <- 10:1
barriers <- c(3,7)
split(s, findInterval(seq_along(s), barriers, left.open = TRUE))
#$`0`
#[1] 10 9 8
#
#$`1`
#[1] 7 6 5 4
#
#$`2`
#[1] 3 2 1
barriers <- c(3,10)
split(s, findInterval(seq_along(s), barriers, left.open = TRUE))
#$`0`
#[1] 10 9 8
#
#$`1`
#[1] 7 6 5 4 3 2 1