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

如何批量计算多组配对变量的实际差值与百分比差值?代码报错求修复

问题:批量计算多组配对变量的实际差值与百分比差值

需要一次性计算多组配对变量("10"和"20"代表测试年份)的实际差值与百分比差值,以下是相关数据、尝试代码及报错,附修复方案:

1. 宽格式样本数据

Group| A_10  |    A_20 |  B_10 |  B_20 

0       20          21        20        23
1       30          10        19        11
2       10          53        30        34
1       22          32        25        20
2       34          40        32        30
0       30          50        NA        40
0       39          40        19        20
1       40          NA        20        20
2       50          10        20        10
0       34          23        30        10

2. 当前尝试的代码

library(dplyr)

# 假设数据框名为'df',变量结构为:
# 'var1_1', 'var1_2'...代表第一组配对变量
# 'var2_1', 'var2_2'...代表第二组配对变量

# 定义需要计算差值的变量对
variable_pairs <- list(
  c("A_10", "A_20"),
  c("B_10", "B_20") # 实际还有20组类似配对变量
)    

# 计算每组变量的实际差值与百分比差值
df6 <- df %>%
  mutate(
    across(
      all_of(unlist(variable_pairs)),
      ~ .x - get(variable_pairs[[cur_column()]][2]),
      .names = "{.col}_actual_diff"
    ),
    across(
      all_of(unlist(variable_pairs)),
      ~ (.x - get(variable_pairs[[cur_column()]][2])) / get(variable_pairs[[cur_column()]][2]) * 100,
      .names = "{.col}_percentage_diff"
    )
  )

3. 报错信息

Error in `mutate()`: ℹ In argument: `across(...)`. Caused by error in `across()`: ! Can't compute column `vo2mlkg_12_actual_diff`. Caused by error in `get()`: ! invalid first argument Run `rlang::last_trace()` to see where the error occurred.

4. 补充:长格式样本数据

Group| variable  | phase |  Value | 

0       A           10        20        
1       B           20        19        
2       C           20        30        
1       D           10        25        
2       E           20        32       
0       F           10        NA        
0       G           20        19        
1       H           10        20        
2       I           10        20        
0       J           20        30        

5. 修复方案(简便高效的长格式处理法)

针对大量配对变量的场景,将宽格式转为长格式统一处理是更高效的方案,以下是修正后的代码(基于@Maël的解决方案翻译优化):

library(dplyr)
library(tidyr)
library(magrittr)

# 移除原数据中不需要的列(此处移除第2列,可根据实际调整)
df2 <- df[,-2] 
# 管道处理数据:转长格式→重命名列→计算差值→分组汇总→转回宽格式
df2 %<>%
  # 将宽格式转为长格式,按下划线拆分变量名,分别对应分组(set)和年份值
  pivot_longer(-group, names_sep = "_", names_to = c("set", ".value")) %>%
  # 重命名列,方便后续处理
  {colnames(.) <- c("group", "set", "pre", "post"); .} %>%
  # 计算实际差值和百分比差值
  mutate(
    diff = post - pre,
    diff_perc = ((post - pre) / pre) * 100
  )%>%
  # 按group和分组变量(set)分组,计算差值的均值(忽略NA)
  group_by(group, set) %>%
  summarize(
    mean_diff = mean(diff, na.rm = TRUE),
    mean_diff_perc = mean(diff_perc, na.rm = TRUE)
  ) %>%
  # 将结果转回宽格式,方便查看每组的差值结果
  pivot_wider(names_from = set, values_from = c(mean_diff, mean_diff_perc))

方案说明:

  • 先将宽格式数据转为长格式,统一处理所有配对变量,避免逐个定义变量对的繁琐
  • 计算实际差值(post - pre)和百分比差值(((post - pre)/pre)*100)
  • 按分组和变量组汇总均值,最后转回宽格式保持结果可读性
  • 自动处理NA值,适合包含缺失值的数据集

内容的提问来源于stack exchange,提问作者amir.fathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:55:10