【问题标题】:How to get next number in sequence in R如何在R中按顺序获取下一个数字
【发布时间】:2016-02-29 01:55:22
【问题描述】:

我需要自动化获取给定序列中下一个数字的过程。

我们能不能做一个有两个输入的函数

  1. 数字向量(例如 3,7,13,21)
  2. 接下来有多少个数字

    seqNext <- function(sequ, next) {
    ..
    }
    
    seqNext( c(3,7,13,21), 3) 
    # 31 43 57
    seqNext( c(37,26,17,10), 1)
    # 5 
    

【问题讨论】:

  • 你是怎么从向量中得到31的
  • 我猜是因为c(3,7,13,21) 增加了 4、6、8,所以接下来的三个将是 10、12、14
  • @RichardScriven 看起来是这样。因此,seq 中的 by 将是 next-1
  • @RichardScriven 我现在正忙于一些工作。我正在考虑从diff 输出中获取第一个数字,然后基于diff(diff 使用seq
  • 有人为这个en.wikipedia.org/wiki/Difference_engine构建了一个R模拟器

标签: r math data-manipulation


【解决方案1】:

借助数学的力量!

x1 <- c(3,7,13,21)
dat <- data.frame(x=seq_along(x1), y=x1)

predict(lm(y ~ poly(x, 2), data=dat), newdata=list(x=5:15))
#  1   2   3   4   5   6   7   8   9  10  11 
# 31  43  57  73  91 111 133 157 183 211 241 

当处理改变其符号的连续差异时,输出值的模式最终会从减少变为增加:

x2 <- c(37,26,17,10)

dat <- data.frame(x=seq_along(x2), y=x2)
predict(lm(y ~ poly(x,2), data=dat), newdata=list(x=1:10))

# 1      2      3      4      5      6      7      8      9     10 
#37     26     17     10      5      2      1      2      5     10
   -(11)   -(9)   -(7)    -(5)   -(3)   -(1)  -(-1)  -(-3) -(-5)
        -2     -2      -2     -2     -2    -2     -2     -2 

作为一个函数:

seqNext <- function(x,n) {
  L <- length(x)
  dat <- data.frame(x=seq_along(x), y=x)
  unname(
    predict(lm(y ~ poly(x, 2), data=dat), newdata=list(x=seq(L+1,L+n)))
  )
}

seqNext(x1,5)
#[1] 31 43 57 73 91
seqNext(x2,5)
#[1] 5 2 1 2 5

这也很容易扩展到模式可能是n 订单深度的情况,例如:

x3 <- c(100, 75, 45, 5, -50)
diff(x3)
#[1] -25 -30 -40 -55
diff(diff(x3))
#[1]  -5 -10 -15
diff(diff(diff(x3)))
#[1] -5 -5

seqNext <- function(x,n,degree=2) {
  L <- length(x)
  dat <- data.frame(x=seq_along(x), y=x)
  unname(
    predict(lm(y ~ poly(x, degree), data=dat), newdata=list(x=seq(L+1,L+n)))
  )
}

seqNext(x3,n=5,deg=3)
#[1] -125 -225 -355 -520 -725

【讨论】:

  • 更准确地说,在我们的答案中,模式可能与 Richard 的不同,而不是当序列越过零,而是当连续差异改变符号时,即当它们在 x 中以绝对值递减时。跨度>
  • @RichardScriven - 没什么太大的争议。根据二阶多项式曲线(U 形),下降模式将一直持续到斜率反转 seqNext(c(10,2,-4), 5),例如:x &lt;- seq(-4,4,0.5); plot(x,poly(x,2)[,2],type="l")
  • 我想说n 订单的扩展应该是显而易见的。这就是为什么这是一个很好的答案。
  • @MatthewLundberg - 谢谢。对于像我这样的笨蛋来说,这些计算都不是显而易见的!编辑主要是为了让我自己回来参考这篇文章!
【解决方案2】:
seqNext <- function(x, n) {
  k <- length(x);  d <- diff(x[(k - 2):k])
  x[k] + 1:n * d[2] + cumsum(1:n) * diff(d[1:2])
}

seqNext(c(3,7,13,21),3) 
# [1] 31 43 57
seqNext(c(37,26,17,10),1)
# [1] 5
seqNext(c(137,126,117,110),10)
# [1] 105 102 101 102 105 110 117 126 137 150
seqNext(c(105,110,113,114),5)
# [1] 113 110 105  98  89

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 2022-12-04
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2010-11-04
    • 2020-08-31
    相关资源
    最近更新 更多