0

我有一个从 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 代码,但它只返回 for 循环序列中的最后一个值,即 0。

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

4

4 回答 4

1

最抽象的方法如下:

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以提取所需数量的第一个元素。i可以通过 访问带有数字的迭代days_decrement[[i]]

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

于 2017-01-12T09:25:21.123 回答
1

我们可以使用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
于 2017-01-12T06:31:43.457 回答
0

我认为这会解决问题...

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

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

于 2017-01-12T06:34:45.273 回答
0

向量每个条目只能有一个元素,如果要将向量分配给一个条目,我建议使用列表。

一种方法如下所示:

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

这会给你想要的吗?

于 2017-01-12T06:29:25.370 回答