使用tidyverse计算非基准模型与OM基准模型的运行差值
嘿,我完全get到你的需求了——要让每个非OM模型的每一次运行,都和OM模型同一次运行的数值做差值对比,对吧?之前的代码没对准「对应运行次」这个关键点,咱们用tidyverse来精准搞定它。
步骤1:先明确数据结构(附模拟数据)
假设你的数据是长格式,包含三列:model(模型名称,OM是基准)、run(运行次数,1/2/3)、value(每次运行的数值)。我先模拟一份符合要求的数据,你可以直接替换成自己的数据集:
library(tidyverse) # 模拟4个模型各3次运行的数据 set.seed(123) # 固定随机数,方便复现 df <- tibble( model = rep(c("OM", "ModelA", "ModelB", "ModelC"), each = 3), run = rep(1:3, 4), value = rnorm(12, mean = 10, sd = 2) )
步骤2:提取OM的基准数据
先把OM的3次运行数据单独拎出来,并重命名数值列,方便后续配对计算:
om_baseline <- df %>% filter(model == "OM") %>% rename(om_value = value) %>% # 把OM的数值列改名,避免和其他模型混淆 select(run, om_value) # 只保留运行次数和OM的数值
步骤3:配对计算差值
用left_join按照「运行次数(run)」把原数据和OM基准数据配对,这样每个模型的每一次运行,都能对应到OM同一次运行的数值,再计算差值:
result <- df %>% left_join(om_baseline, by = "run") %>% # 按run配对,确保同次运行对应 mutate(value_diff = value - om_value) %>% # 计算当前模型值 - OM对应run的值 filter(model != "OM") %>% # 可选:过滤掉OM自己的行(差值为0,没必要保留) select(model, run, value, om_value, value_diff) # 整理输出列的顺序
看看结果
运行完上面的代码,你会得到这样的结果(以模拟数据为例):
# A tibble: 9 × 5 model run value om_value value_diff <chr> <int> <dbl> <dbl> <dbl> 1 ModelA 1 9.43 8.89 0.542 2 ModelA 2 9.94 10.4 -0.473 3 ModelA 3 10.9 10.9 0.046 4 ModelB 1 7.95 8.89 -0.940 5 ModelB 2 11.0 10.4 0.594 6 ModelB 3 11.6 10.9 0.720 7 ModelC 1 9.48 8.89 0.590 8 ModelC 2 9.80 10.4 -0.595 9 ModelC 3 9.60 10.9 -1.29
这里的value_diff就是你要的「每个模型每次运行与对应OM运行的差值」啦!
关键说明
- 核心逻辑是按run配对,而不是按模型分组计算,这才解决了你之前代码只算模型内差值的问题。
- 如果你的
run列不是数字(比如是字符串、日期),只要它能唯一标识每一次运行,这个方法完全适用。
内容的提问来源于stack exchange,提问作者2ton21
相关产品推荐
相关产品推荐

