如何在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
相关产品推荐
相关产品推荐

