【问题标题】:Using seq and rep to create a sequence of 5 integers that go up by 1 on each repetition使用 seq 和 rep 创建一个由 5 个整数组成的序列,每次重复增加 1
【发布时间】:2019-01-15 02:10:14
【问题描述】:

我正在尝试创建向量:1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 使用repseq 函数

到目前为止,我有这个:

rep(seq(1,5),5)

产量:

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

我终其一生都无法弄清楚如何逐步添加 +1。

我尝试过rep(seq(1,5),5,+1)rep(seq(1,5),5, each +1 以及许多其他变体。

需要for循环吗?

【问题讨论】:

    标签: r sequence


    【解决方案1】:

    利用R的循环向量特性:

    1:5 + rep(0:4, each = 5)
    # [1] 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9
    

    请注意,1:5 给出的结果与seq(1,5) 相同。

    【讨论】:

    • 我喜欢这个答案。
    • 为此使用矢量回收确实符合 R 的精神,很好的答案。
    【解决方案2】:

    看看sequence

    sequence(nvec = rep(5L, 5L), from = 1:5)
    [1] 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9
    

    注意from 参数是在 R 4.0.0 中引入的。来自R News 4.0.0

    sequence() [...] 获得参数 [e.g. from] 生成更复杂的序列。

    【讨论】:

      【解决方案3】:

      这将是一个分而治之的案例。所以你基本上想要构建一个1-5、2-6、3-7、4-8、5-9的序列。这里的模式是 i-(i+4)。

      所以这里有一个解决方案:

      unlist(lapply(1:5, function(i) seq(i, i+4)))
      

      您为 i = 1-5 执行子模式。结果是一个列表,因此您将其取消列出,将您简化为一个简单的

       [1] 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9
      

      编辑: 是的,您确实需要一个“循环”,但这清楚地表明在 R 中,可以使用 *apply 函数(sapply、@987654325 @、applymapply)。

      在这种情况下,我们对不同的值执行 same 函数,这就是使用sapply 更容易的原因。如果您的计算依赖于先前的值或行,则可以使用传统循环。

      这里,你的函数是seq(i, i+4)。当它如此简单时,我们不会费心将其分配给名称,而是创建了一个“lambda 函数”或“匿名”函数。可以通过以下方式获得完全相同的结果:

      sequence_1_to_4 <- function(i) {
        seq(i, i+4)
      }
      sequences <- lapply(1:5, sequence_1_to_4)
      single_sequence <- unlist(sequences)
      

      【讨论】:

        【解决方案4】:

        在新 R 中,您可以这样做。 \(x) 是函数的快捷方式。

        c(sapply(1:5, \(x) x:(x+4)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 2021-11-17
          • 1970-01-01
          • 2015-12-23
          • 1970-01-01
          • 2021-08-25
          • 2021-11-01
          相关资源
          最近更新 更多