代码之家  ›  专栏  ›  技术社区  ›  Joachim Schork

在数字向量的每对值之间添加序列

  •  1
  • Joachim Schork  · 技术社区  · 5 年前

    考虑下面的例子:

    # Example vector
    set.seed(123)
    x <- round(runif(5, 0, 100))
    x
    ### 29 79 41  88 94
    

    输出应如下所示:

    # Desired output
    c(seq(29, 79, length.out = 5),
      seq(79, 41, length.out = 5)[- 1],
      seq(41, 88, length.out = 5)[- 1],
      seq(88, 94, length.out = 5)[- 1])
    # 29 42 54 66 79 70 60 50 41 53 64 76 88 90 91 92 94
    

    29和79之间的添加顺序为42,54,66;79和41之间的添加顺序为70,60,50;等等

    我怎样才能以自动化的方式进行这样的操作?

    2 回复  |  直到 5 年前
        1
  •  2
  •   akrun    5 年前

    一个选择是 Map 通过删除 last 元素和 first 元素,从中删除第一个元素 list unlist 输出并附加向量的第一个元素

    c(x[1], unlist(lapply(Map(seq, x[-length(x)], x[-1],
               MoreArgs = list(length.out = 5)), `[`, -1)))
    #[1] 29.00 41.50 54.00 66.50 79.00 69.50 60.00 50.50 41.00 
    #[11] 52.75 64.50 76.25 88.00 89.50 91.00 92.50 94.00
    
        2
  •  2
  •   Douglas Mesquita    5 年前

    一个不新奇的解决方案是:

    set.seed(123)
    x <- round(runif(5, 0, 100))
    x
    
    c(x[1], unlist(lapply(X = 1:(length(x)-1), function(i) seq(x[i], x[i+1], length.out = 5)[-1])))
    [1] 29.00 41.50 54.00 66.50 79.00 69.50 60.00 50.50 41.00 52.75 64.50 76.25 88.00 89.50 91.00 92.50 94.00
    

    29 79 41 88 94