R语言如何基于两个dataframe按权重计算新变量?
解法1:基础R矩阵乘法(推荐,运算速度快,适配多变量场景不用改代码)
你要实现的加权计算本质是参数矩阵和权重矩阵的乘法,直接用R内置的矩阵运算即可,哪怕df1有数千行也能秒出结果:
# 1. 构造示例数据(你自己用的时候替换成你实际的df1、df2即可) df1 <- data.frame(IDMH=c('MH1','MH2','MH3'), param1 =c(0.5,1,0.005), param2=c(0,0.1,2), param3=c(4,5,6)) df2 <- data.frame(Parameters=c('param1','param2','param3'), FON_ECOL =c(1,0.5,1), BIOD=c(0,0,1), MEN=c(1,1,0)) # 2. 提取参数矩阵(去掉不需要参与计算的ID列) param_mat <- as.matrix(df1[, !colnames(df1) %in% "IDMH"]) # 3. 提取权重矩阵(去掉参数名标识列) weight_mat <- as.matrix(df2[, !colnames(df2) %in% "Parameters"]) # 4. 矩阵乘法直接计算所有加权新变量 weighted_result <- param_mat %*% weight_mat # 5. 把计算结果合并回原数据表 df1_final <- cbind(df1, weighted_result)
运行后得到的df1_final就会自带FON_ECOL、BIOD、MEN三个新的加权变量,比如FON_ECOL列的结果就是你示例里要求的计算规则,完全匹配。
解法2:tidyverse风格写法(适合习惯用dplyr的场景)
如果你平时常用tidyverse套件,也可以用如下写法:
library(dplyr) library(tibble) # 把权重表转成命名向量列表 weight_list <- df2 %>% column_to_rownames("Parameters") %>% as.list() # 遍历每个权重规则计算新变量 df1_final <- df1 %>% mutate(!!!lapply(weight_list, \(w) { rowSums(across(names(w)) * w) }))
注意事项
只要你实际数据里,df1的参数列名和df2的Parameters列的取值完全对应,不管后续加多少参数、加多少权重规则,上面的代码都可以直接复用,不用手动写每个变量的计算式,避免出错。
内容的提问来源于stack exchange,提问作者Valerie DG
相关产品推荐
相关产品推荐

