如何将数学函数的xy坐标返回到任意长度的 Dataframe 中?

yhqotfr8  于 2023-03-21  发布在  其他
关注(0)|答案(3)|浏览(128)

我想得到一个包含n个xy坐标的 Dataframe ,这些坐标描述了两点P1(x1,y1)和P2(x2,y2)之间的线性函数。
我的方法是找到两点的xy坐标,然后计算线性方程y = slope * x + intercept的斜率和截距。
为简单起见,设:P级

x1 = 0.1
y1 = 0.2
x2 = 1.1
y2 = 0.6

n = c(1:200) #example length of my data

slope = (y2 - y1) / (x2 - x1)
intercept = y1 - slope * x1

到目前为止一切顺利,但现在我想将线性方程的各个xy坐标计算到一个 Dataframe baseline中,该 Dataframe 具有length(n)行,列为x_baseline * 和 * y_baseline
一个人将如何着手解决这个问题呢?到目前为止,我还没有在网上找到一个满意的答案,任何帮助都是非常感谢的!
为了说明,我绘制了所需的输出here

laik7k3q

laik7k3q1#

如果你有x1y1x2y2,你可以使用一些代数来计算点之间的插值

steps <- (n-1)/(max(n)-1)
dd <- data.frame(
  x = x1 + (x2-x1) * steps,
  y = y1 + (y2-y1) * steps
)

我们可以用

plot(y~x, dd)
points(c(x1,x2), c(y1, y2), col="green", pch=16)

也可以使用approx进行插值

dd <- data.frame(
  x = approx(c(0,1), c(x1, x2), seq(0, 1, length.out = length(n)))$y,
  y = approx(c(0,1), c(y1, y2), seq(0, 1, length.out = length(n)))$y
)

或者如果你真的想使用slopeintercept,你可以

dd <- data.frame(
  x = seq(x1, x2, length.out = length(n))
) |>
  transform(y = intercept + x * slope)
vsnjm48y

vsnjm48y2#

如果你不想自己做数学计算,可以拟合一个线性模型,并从中进行预测:

library(tidyverse)
library(modelr)

baseline <- tibble(
  x = c(0.1, 1.1), 
  y = c(0.2, 0.6)
)

mod <- lm(y ~ x, baseline)

baseline |> 
  data_grid(x = seq_range(x, 200)) |> 
  add_predictions(mod, var = "y_baseline") |> 
  rename(x_baseline = x)
#> # A tibble: 200 × 2
#>    x_baseline y_baseline
#>         <dbl>      <dbl>
#>  1      0.1        0.200
#>  2      0.105      0.202
#>  3      0.110      0.204
#>  4      0.115      0.206
#>  5      0.120      0.208
#>  6      0.125      0.210
#>  7      0.130      0.212
#>  8      0.135      0.214
#>  9      0.140      0.216
#> 10      0.145      0.218
#> # … with 190 more rows

创建于2023年3月12日,使用reprex v2.0.2

enyaitl3

enyaitl33#

您的x值将由seq(x1, x2, length = 100)给出,新的y值由该向量乘以slope加上intercept得到:

df <- data.frame(x_baseline = seq(x1, x2, length = 100), 
                 y_baseline = slope * seq(x1, x2, length = 100) + intercept)

让我们用红色绘制原始点,用黑色绘制 Dataframe 的点:

plot(c(x1, x2), c(y1, y2), col = "red", cex = 2)
points(df$x_baseline, df$y_baseline)

创建于2023年3月11日,使用reprex v2.0.2

相关问题