【问题标题】:Add sequence between each pair of values of a numeric vector在数值向量的每对值之间添加序列
【发布时间】:2019-06-30 13:33:34
【问题描述】:

我有一个数字向量,我想在该向量的每两个值之间添加一个由三个附加数字组成的序列。

考虑以下示例:

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

我想在这五个值之间插入 3 个新数字。数字应该是每对值之间长度为 3 的序列。

输出应如下所示:

# 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;等等……

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

【问题讨论】:

    标签: r vector sequence


    【解决方案1】:

    一个选项是Map,通过删除last元素和first元素来获取相邻数字的序列,从listunlist的输出中删除第一个元素并附加第一个元素向量

    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
    

    【讨论】:

    • 感谢您的回复!不幸的是,您的代码并未完全提供所需的输出,因为原始数字包含两次。你的输出是29 42 54 66 79 79 70 60 50 41 41 53 64 76 88 88 90 91 92 94 而不是29 42 54 66 79 70 60 50 41 53 64 76 88 90 91 92 94。有没有办法修改你的代码?
    • @JSP 你的意思是删除第一个元素,对吧?
    • @JSP 现在,检查输出
    【解决方案2】:

    一个不花哨的解决方案是:

    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

    【讨论】:

    • 感谢您的回答,并对种子的错误表示歉意。但是,您的代码没有产生所需的输出,因为它只在每对值之间添加一个数字,然后重复原始值两次。有没有办法相应地修改你的代码?
    • 你是对的。我的错。我将编辑我的答案。实际上参数length.out必须是5
    • 非常感谢您提供的替代解决方案!
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2018-02-18
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多