【问题标题】:R: Interpolate y for rising and falling limbs for the same xR:为相同 x 的上升和下降肢体插入 y
【发布时间】:2018-04-02 18:32:12
【问题描述】:

我得到一个 x,y 数据,它是一个顺时针循环。在 R 中,我想确定中点 x 值 (Xmid),然后在两个肢体上插入 y 值以获得相同的 Xmid

x <- c(1.62, 1.82,2.09, 2.48, 2.19, 1.87, 1.67)
y <- c(238, 388, 721, 744, 307, 246, 222)

plot(x, y, type = 'l')

mid <- function(x){
  0.5*(max(x, na.rm = T) - min(x, na.rm = T)) + min(x,na.rm = T)
} 

但是!当我使用 approx 函数时,它只返回一个 y 值(对于上升的肢体)。如何获得第二个(下肢)?也许还有其他功能可以做到这一点?

> approx(x, y, xout = mid(x))
$x
[1] 2.05

$y
[1] 634.6364

换句话说,我正在尝试这样做:来自 [Lawler et al., 2006] 的图形示例是 here

【问题讨论】:

  • approx() 仅适用于来自适当数学“函数”的数据以提高效率。您绘制的不是函数,因为函数需要传递 vertical line test
  • 基于 MrFlick 的评论,您可以通过将矢量分成两个单独的部分(至少作为示例)并在每个部分上使用 approx 来伪造这一点。
  • 谢谢,但我没有必要使用approx() 函数。也许存在获得此值的另一种方法?我不想打破分离向量,因为我的数据集有点复杂。

标签: r interpolation


【解决方案1】:

由于数据不规则(它不对应于“适当的”函数),您将不得不自己找到所有的交叉点。我认为你可以用类似的东西来做到这一点

target <- mid(x)
idx <- which(abs(diff(sign(x-target)))>0)

找到位于您感兴趣的 x 值两侧的所有点对,然后您可以提取每个点的 y 值

f <- function(i, target) approx(c(x[i], x[i+1]), c(y[i], y[i+1]), xout=target)$y
yp <- sapply(idx, f, target=target)

然后你可以绘制结果

abline(v=target, lty=2)
points(rep(target, length(yp)), yp, col="red", cex=2)

【讨论】:

  • 非常感谢。它有助于。对了,你为什么在f函数的末尾使用$y
  • 因为 approx 返回一个包含 x 和 y 值的列表,而我们只需要 y 值。
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 2019-06-03
  • 2012-02-21
  • 2016-05-06
  • 2021-08-18
  • 2020-06-11
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多