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)))
)。
我有一系列天数,从 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)))
)。