【问题标题】:One-liner to create a list of iterating sequences?单线创建迭代序列列表?
【发布时间】:2018-10-20 17:59:05
【问题描述】:

我需要创建一个总是返回到序列中第一个数字的序列列表。我已经编写了下面的代码,但它看起来很笨重。有没有使用更少字符的解决方案?


(i = seq(1, 24, by = 3))
#> [1]  1  4  7 10 13 16 19 22
(i_list = purrr::map(i, ~c(.:(. + 2), .)))
#> [[1]]
#> [1] 1 2 3 1
#> 
#> [[2]]
#> ...

编辑:这是lapply() 的一种方式。不知道为什么这会受到反对,欢迎任何关于如何改进问题的建议!

(i_list = lapply(i, function(x) c(x:(x+2), x)))

我想知道replicate() 是否有办法,所以添加了那个标签。

【问题讨论】:

  • 您的代码占一行,长度为 42 个字符。怎么这么笨重?
  • 我想知道是否有 1 班轮。

标签: r list iteration lapply replicate


【解决方案1】:

在矩阵中,而不是列表形式,有:

cbind(matrix(1:24, ncol=3,byrow=TRUE),seq(1, 24, by = 3))

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    1
[2,]    4    5    6    4
[3,]    7    8    9    7
[4,]   10   11   12   10
[5,]   13   14   15   13
[6,]   16   17   18   16
[7,]   19   20   21   19
[8,]   22   23   24   22

然后您将遍历矩阵的行而不是列表的元素。

或者如果你喜欢打代码:

> seq(1,24,by=3) + t(matrix(c(0,1,2,0),ncol=8,nrow=4))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    1
[2,]    4    5    6    4
[3,]    7    8    9    7
[4,]   10   11   12   10
...

但是在这种情况下,您在构建+ 的 RHS 方面投入了多少工作?你的问题是如何参数化的?

这取决于i 是否具有规则模式(对步长进行了一些调整),它不适用于任意i 序列。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2017-02-10
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多