You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中用每行主对角线元素除该行生成新数据框?

解决方案

首先确认你的原始数据集结构:

dat <- as.data.frame(t(cbind(c(5,10,15,20),c(10,20,30,40),c(50,100,150,200),c(200,400,600,800))))
dat

运行后得到的dat是4行4列的数据框,主对角线元素分别为第1行的5、第2行的20、第3行的150、第4行的800。

要实现每行元素除以该行对应主对角线元素,这里提供两种高效方法:

方法1:矩阵运算(简洁高效)

利用矩阵广播特性完成逐行除法,再转回数据框:

# 提取主对角线元素
diag_vals <- diag(as.matrix(dat))
# 两次转置实现按行广播除法,再转回数据框
dat_new <- as.data.frame(t(t(as.matrix(dat)) / diag_vals))
# 保留两位小数匹配预期结果(可选)
dat_new <- round(dat_new, 2)

方法2:apply逐行处理

如果更习惯逐行逻辑,可使用apply函数:

dat_new <- as.data.frame(t(apply(dat, 1, function(row) {
  # 获取当前行对应的主对角线元素(行号与列号一致)
  diag_val <- row[as.integer(rownames(dat)[which(dat == row)[1]])]
  row / diag_val
})))
dat_new <- round(dat_new, 2)

运行任意一种方法后,得到的dat_new与预期结果一致:

> dat_new
     V1   V2   V3   V4
1 1.00 5.00 3.00 4.00
2 0.50 1.00 1.50 2.00
3 0.33 0.67 1.00 1.33
4 0.25 0.50 0.75 1.00

注:方法1中两次t()转置是为了让R的向量除法按行广播;若直接使用as.matrix(dat) / diag_vals会按列广播,不符合需求。

内容的提问来源于stack exchange,提问作者nickolakis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:50:33