基于两个数据框的参数加权计算需求
基于两个数据框的参数加权计算需求
嗨,我明白你需要用第二个数据框里的Desirability值,对第一个数据框的参数值做加权计算,公式是1 - (第一个表的参数值 / 第二个表对应参数的Desirability)对吧?我来给你用R实现这个需求,步骤很清晰:
首先,先把你提供的两个数据框加载到环境里:
# 第一个数据框:各样本的参数数值 df1 <- structure(list(`SE_HMWS (%) (2-8°C)` = c(0.125, 0.125, 0.285714285714286, 0.125, 0.25, 0.125, 0.222222222222222, 0.125, 0.125, 0.25), `SE_HMWS (%) (25±2°C)` = c(1, 0.875, 1, 0.875, 1.125, 0.875, 1.11111111111111, 0.875, 0.875, 1), `SE_HMWS (%) (40±2°C)` = c(5.875, 5.625, 6, 5.375, 6.5, 5.125, 5.66666666666667, 5.625, 5.375, 5.375), `SE_LMWS (%) (2-8°C)` = c(0.0434782608695652, 0, 0.0434782608695652, 0.0434782608695652, 0.0434782608695652, 0.0434782608695652, 0.0434782608695652, 0.0434782608695652, 0.0434782608695652, 0.0434782608695652), `SE_LMWS (%) (25±2°C)` = c(0.434782608695652, 0.434782608695652, 0.434782608695652, 0.391304347826087, 0.434782608695652, 0.434782608695652, 0.478260869565218, 0.434782608695652, 0.434782608695652, 0.391304347826087), `SE_LMWS (%) (40±2°C)` = c(2.60869565217391, 2.56521739130435, 2.52173913043478, 2.52173913043478, 2.52173913043478, 2.47826086956522, 2.52173913043478, 2.52173913043478, 2.56521739130435, 2.34782608695652), `SE_Monomer (%) (2-8°C)` = c(-0.00206398348813208, -0.0010319917440661, -0.00206185567010309, -0.00206185567010309, -0.00206611570247939, -0.00206398348813208, -0.00206611570247939, -0.00206398348813208, -0.00206398348813208, -0.00206398348813208 ), `SE_Monomer (%) (25±2°C)` = c(-0.018575851393189, -0.0175438596491229, -0.0175257731958763, -0.0185567010309278, -0.018595041322314, -0.0165118679050569, -0.021694214876033, -0.0175438596491229, -0.0175438596491229, -0.0175438596491229), `SE_Monomer (%) (40±2°C)` = c(-0.109391124871001, -0.107327141382869, -0.104123711340206, -0.105154639175258, -0.112603305785124, -0.101135190918473, -0.112603305785124, -0.106295149638803, -0.105263157894737, -0.100103199174407)), row.names = c("STD786_F1_225mg/mL - 50mM His/His.HCl, 150mM Arg.HCl, 70mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F10_225mg/mL - 50mM His/His.HCl, 110mM Arg.HCl, 135mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F2_225mg/mL - 50mM His/His.HCl, 165mM Arg.HCl, 135mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F3_225mg/mL - 50mM His/His.HCl, 110mM Arg.HCl, 135mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F4_225mg/mL - 50mM His/His.HCl, 110mM Arg.HCl, 45mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F5_225mg/mL - 50mM His/His.HCl, 70mM Arg.HCl, 200mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F6_225mg/mL - 50mM His/His.HCl, 70mM Arg.HCl, 70mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F7_225mg/mL - 50mM His/His.HCl, 150mM Arg.HCl, 200mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F8_225mg/mL - 50mM His/His.HCl, 110mM Arg.HCl, 225mM Pro, 0.02% PS80 - pH5.50-Glass vial", "STD786_F9_225mg/mL - 50mM His/His.HCl, 55mM Arg.HCl, 135mM Pro, 0.02% PS80 - pH5.50-Glass vial" ), class = "data.frame") # 第二个数据框:参数的Desirability和Importance df2 <- structure(list(Parameters = c("SE_HMWS (%) (2-8°C)", "SE_HMWS (%) (25±2°C)", "SE_HMWS (%) (40±2°C)", "SE_LMWS (%) (2-8°C)", "SE_LMWS (%) (25±2°C)", "SE_LMWS (%) (40±2°C)", "SE_Monomer (%) (2-8°C)", "SE_Monomer (%) (25±2°C)", "SE_Monomer (%) (40±2°C)"), Desirability = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), Importance = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, -9L), class = "data.frame")
接下来,我们把第二个数据框里的Desirability转换成一个命名向量,这样可以方便地和第一个数据框的列名(也就是参数名)一一对应:
# 生成参数名对应Desirability的命名向量 desirability_map <- setNames(df2$Desirability, df2$Parameters)
现在就可以用两种方法来计算加权结果了,你可以选自己习惯的:
方法1:用dplyr(tidyverse风格)
如果你平时用tidyverse系列包,这个方法更简洁:
library(dplyr) # 对每一列应用计算规则:1 - (当前列值 / 对应参数的Desirability) weighted_result <- df1 %>% mutate(across(everything(), ~ 1 - (.x / desirability_map[cur_column()])))
方法2:用基础R(不需要额外安装包)
如果你不想加载额外的包,基础R的方法也能实现:
# 遍历每个参数列,计算加权值 weighted_result <- as.data.frame(lapply(names(df1), function(param) { 1 - (df1[[param]] / desirability_map[param]) })) # 给结果框设置和原数据一致的列名和行名 names(weighted_result) <- names(df1) row.names(weighted_result) <- row.names(df1)
这样得到的weighted_result就是你想要的最终结果啦!每个样本的每个参数都按照1 - (第一个表的参数值 / 第二个表对应参数的Desirability)公式计算完成,而且不管以后Desirability的数值有没有变化,这个代码都能自动匹配对应参数的值,不用手动修改。
备注:内容来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

