如何在R语言中批量求解数据框每行的二元线性方程组
批量求解每行的二元线性方程组(供需均衡计算)
针对你的数据集,每行对应一组供需曲线的二元线性方程组,以下是三种批量求解并添加结果列的方法:
方法1:使用apply函数(简洁直观)
利用apply按行遍历数据框,对每行执行求解函数,再将结果合并回原数据:
# 定义单行求解函数 solve_single_eq <- function(row) { coeff_matrix <- rbind(c(row["y1"], row["x1"]), c(row["y2"], row["x2"])) const_vector <- c(row["b1"], row["b2"]) solve(coeff_matrix, const_vector) } # 批量处理所有行,转置结果为矩阵 eq_solutions <- t(apply(df, 1, solve_single_eq)) # 将结果添加到原数据框 df$Price <- eq_solutions[, 1] df$Quantity <- eq_solutions[, 2]
方法2:向量化解析解(高效首选)
对于二元线性方程组,可直接利用代数解析公式计算,避免循环/迭代,效率更高:
给定方程组:
y1*Price + x1*Quantity = b1 y2*Price + x2*Quantity = b2
解析解推导:
- 行列式:
det = y1*x2 - x1*y2 - 均衡价格:
Price = (b1*x2 - b2*x1)/det - 均衡数量:
Quantity = (y1*b2 - y2*b1)/det
对应R代码:
# 计算行列式 df$det <- df$y1 * df$x2 - df$x1 * df$y2 # 计算均衡价格和数量 df$Price <- (df$b1 * df$x2 - df$b2 * df$x1) / df$det df$Quantity <- (df$y1 * df$b2 - df$y2 * df$b1) / df$det # 可选:删除临时行列式列 # df$det <- NULL
方法3:修正后的循环写法
如果之前循环失败,可能是初始化或索引问题,以下是正确的逐行循环实现:
# 初始化结果列 df$Price <- NA_real_ df$Quantity <- NA_real_ # 逐行求解并赋值 for (i in seq_len(nrow(df))) { A <- rbind(c(df$y1[i], df$x1[i]), c(df$y2[i], df$x2[i])) B <- c(df$b1[i], df$b2[i]) solution <- solve(A, B) df$Price[i] <- solution[1] df$Quantity[i] <- solution[2] }
验证结果
三种方法得到的结果一致,第一行的均衡价格为~2460.396,均衡数量为~764595,与你手动求解的结果匹配。
内容的提问来源于stack exchange,提问作者KjetilH
相关产品推荐
相关产品推荐

