如何批量计算多组配对变量的实际差值与百分比差值?代码报错求修复
问题:批量计算多组配对变量的实际差值与百分比差值
需要一次性计算多组配对变量("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
相关产品推荐
相关产品推荐

