【问题标题】:How to interpolate vector by y in R如何在R中用y插值向量
【发布时间】:2021-03-13 22:23:49
【问题描述】:

我有一个带坐标的向量

x <- c(1, 3, 5, 7)
y <- c(2.6, 7.3, 6.8, 1.9)

我需要同时通过xy 对向量 (x, y) 进行插值。 x我可以做

approxfun(x, y)(1:7)

但是如何通过y 进行插值?我需要在相邻的y1y2 之间获取n = floor(abs(y1 - y2)) 点。

【问题讨论】:

  • 我不确定我是否理解您想要的输出。在这种特殊情况下,您希望收到什么值?所以你只想翻转你的 approxfun 吗? approxfun(y, x)?或者你在做什么样的建模假设?
  • 是的,我只想翻转 approxfun 并获得更多的 (x, y) 坐标

标签: r interpolation purrr


【解决方案1】:

您可以使用purrr::pmap 结合dplyr::lagx[i-1]x[i] 之间进行插值。
对于两点之间的线性插值,将间隔削减xy 并不重要,这样approxfun(x, y) 仍然有效:

library(dplyr)
library(purrr)

x <- c(1, 3, 5, 7)
y <- c(2.6, 7.3, 6.8, 1.9)


df <- data.frame(x=x,y=y)

df %>% mutate(xprev = lag(x),yprev=lag(y)) %>% 
  purrr::pmap(~with(list(...),{
    if (is.na(xprev)) {
      data.frame(x=x,y=y)
    } else {
      n <-  floor(abs(yprev-y)) + 2
      if (n>0) {
        xstep <- (x-xprev) / n  
        xsteps <- seq(xprev+xstep,x ,by = xstep )       
        data.frame(x=xsteps, y=approxfun(c(xprev,x),c(yprev,y))(xsteps))
      }
    }
  })) %>% bind_rows 
#>     x     y
#> 1 1.0 2.600
#> 2 1.5 3.775
#> 3 2.0 4.950
#> 4 2.5 6.125
#> 5 3.0 7.300
#> 6 5.5 5.575
#> 7 6.0 4.350
#> 8 6.5 3.125
#> 9 7.0 1.900

【讨论】:

  • 完美!但修复 n &lt;- floor(abs(yprev - y)) + 2 以包含原始点
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2011-01-30
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2020-03-27
相关资源
最近更新 更多