R重复一个序列,将最大值减1

R repeat a seqeunce reducing max value by 1

我有一系列天数,从 0(开始)到 5(最后一天)我想创建一个重复 N 次的列表,其中 N 是总天数,在本例中是 6 天(0,1,2,3,4,5),每次连续重复应该将向量的长度减1。

所以输出应该是:

0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0

我试过了

for(i in 5:0){
i<-seq(from=0,to=i,by=1)
print(i)
}

这打印出正确的输出:

0 1 2 3 4 5
0 1 2 3 4
0 1 2 3 
0 1 2 
0 1
0

如何将每次迭代的输出写入向量?我尝试将 listItems 变量分配为 0 并使用 listItems[i] <- seq 代码,但它仅 returns for 循环序列中的最后一个值为 0.

我想我错过了一些非常简单的东西(像往常一样)

一个vector的每个entry只能有一个元素,如果你想把vector赋值给一个entry,我建议使用list。

一种方法如下所示:

retList <- list()
for (i in 5:0) {
    res <- 0:i
    retList <- append(retList, list(res))
}
retList
# [[1]]
# [1] 0 1 2 3 4 5
# 
# [[2]]
# [1] 0 1 2 3 4
# 
# [[3]]
# [1] 0 1 2 3
# 
# [[4]]
# [1] 0 1 2
# 
# [[5]]
# [1] 0 1
# 
# [[6]]
# [1] 0

# or access a part 
retList[[2]]
# [1] 0 1 2 3 4

这是否给了你想要的东西?

我们可以使用 sequence

sequence(6:1)-1
#[1] 0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0

我认为这会成功...

unlist(lapply(5:0, seq, from = 0))

本质上,这使用lapply()c(5,4,3,2,1,0)的每个值传递给seq()to参数,同时保持from参数不变在 0。结果在列表中,因此 unlist().

最抽象的方法如下:

days <- 0:5
days_decrement <- lapply(rev(seq_along(days)), head, x=days)
days_decrement
# [[1]]
# [1] 0 1 2 3 4 5
# 
# [[2]]
# [1] 0 1 2 3 4
# 
# [[3]]
# [1] 0 1 2 3
# 
# [[4]]
# [1] 0 1 2
# 
# [[5]]
# [1] 0 1
# 
# [[6]]
# [1] 0

rev(seq_along(days) 创建每次迭代的最后一个索引的向量,然后 lapply 使用 head 对其进行迭代以提取所需数量的第一个元素。可以通过 days_decrement[[i]].

访问编号为 i 的迭代

这种方法是通用的,当数据按行存储时可以使用数据框和矩阵(尽管 rev(seq_along(days) 应更改为 rev(seq_len(nrow(days))))。