R:自动求解数据框架中的多个方程组

3gtaxfhh  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(107)

我正在处理一个数据集,它可以求解2个方程和2个未知数的简单方程组,但是,由于这样的方程组有数百个,我需要找到一些算法,也许是一个循环,来执行 Dataframe 中n行的任务。
考虑以下数据框:

df <- as.data.frame(rbind(c(1,  0.214527122,    166486.7605,    1,  -0.003217907,   0),
            c(1,    0.227828903,    160088.1385,    1,  -0.003417434,   0),
            c(1,    0.214324606,    154445.4132,    1,  -0.003214869,   0),
            c(1,    0.218698883,    147921.278,     1,  -0.003280483,   0),
            c(1,    0.201444364,    151268.6711,    1,  -0.003021665,   0)))
colnames(df) = c("y1",  "x1",   "b1",   "y2",   "x2",   "b2")

请注意,这个数据集中的每一行都包含两个线性方程,分别对应于两个未知数x和y。

> df
  y1        x1       b1 y2           x2 b2
1  1 0.2145271 166486.8  1 -0.003217907  0
2  1 0.2278289 160088.1  1 -0.003417434  0
3  1 0.2143246 154445.4  1 -0.003214869  0
4  1 0.2186989 147921.3  1 -0.003280483  0
5  1 0.2014444 151268.7  1 -0.003021665  0

这两个方程代表经济模型中的供给和需求曲线。我想计算数据框架中每一行的最终均衡价格和数量。
例如,我可以用下面的代码求解第一行:

A <- rbind(c(df$y1[1], df$x1[1]), 
           c(df$y2[1], df$x2[1]))

B <- c(df$b1[1],df$b2[1])

> solve(A,B)
[1]   2460.396 764595.000

在均衡状态下,价格为2460.4,数量为764 595。然后,我可以将此结果添加到数据框中的两个新列中:

df$Price[1] <- solve(A,B)[1]
df$Quantity[1] <- solve(A,B)[2]

> df
  y1        x1       b1 y2           x2 b2    Price Quantity
1  1 0.2145271 166486.8  1 -0.003217907  0 2460.396   764595
2  1 0.2278289 160088.1  1 -0.003417434  0       NA       NA
3  1 0.2143246 154445.4  1 -0.003214869  0       NA       NA
4  1 0.2186989 147921.3  1 -0.003280483  0       NA       NA
5  1 0.2014444 151268.7  1 -0.003021665  0       NA       NA

这是第一行,但我还没有找到一个好的方法来自动求解数据框中的每一行,我想某种类型的循环可能是一个选项,但我没有运气解决它。

vdgimpew

vdgimpew1#

重新排列列,使前4列为矩阵,然后运行以下apply

df2 <- df[c("y1", "y2", "x1", "x2", "b1", "b2")]
t(apply(df2, 1, function(x) solve(matrix(x[1:4], 2), x[5:6])))

给予

[,1]   [,2]
[1,] 2460.396 764595
[2,] 2365.835 692284
[3,] 2282.444 709965
[4,] 2186.029 666374
[5,] 2235.497 739823
tp5buhyn

tp5buhyn2#

一个dplyr选项

library(dplyr)
library(purrr)
df |>
  dplyr::rowwise() |>
  dplyr::mutate(
    Price = (solve(rbind(
      c(cur_data()$y1, cur_data()$x1),
      c(cur_data()$y2, cur_data()$x2)
    ), c(
      cur_data()$b1,
      cur_data()$b2
    )) |>
      pluck(1)
    ),
    Quantity = (solve(rbind(
      c(cur_data()$y1, cur_data()$x1),
      c(cur_data()$y2, cur_data()$x2)
    ), c(
      cur_data()$b1,
      cur_data()$b2
    )) |>
      pluck(2)
    )
  )

输出:

# A tibble: 5 × 8
# Rowwise: 
     y1    x1      b1    y2       x2    b2 Price Quantity
  <dbl> <dbl>   <dbl> <dbl>    <dbl> <dbl> <dbl>    <dbl>
1     1 0.215 166487.     1 -0.00322     0 2460.  764595.
2     1 0.228 160088.     1 -0.00342     0 2366.  692284.
3     1 0.214 154445.     1 -0.00321     0 2282.  709965.
4     1 0.219 147921.     1 -0.00328     0 2186.  666374.
5     1 0.201 151269.     1 -0.00302     0 2235.  739823.
jv2fixgn

jv2fixgn3#

要添加两个新列,请考虑mapply,按元素处理apply系列的成员:

get_equilibrium <- function(y1, x1, b1, y2, x2, b2) {
  A <- rbind(c(y1, x1), c(y2, x2))
  B <- c(b1, b2)
  solve(A, B)
}

df[c("Price", "Quantity")] <- t(mapply(
  get_equilibrium, df$y1, df$x1, df$b1, df$y2, df$x2, df$b2
))

df
#   y1        x1       b1 y2           x2 b2    Price Quantity
# 1  1 0.2145271 166486.8  1 -0.003217907  0 2460.396   764595
# 2  1 0.2278289 160088.1  1 -0.003417434  0 2365.835   692284
# 3  1 0.2143246 154445.4  1 -0.003214869  0 2282.444   709965
# 4  1 0.2186989 147921.3  1 -0.003280483  0 2186.029   666374
# 5  1 0.2014444 151268.7  1 -0.003021665  0 2235.497   739823

相关问题