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

R如何计算分组内两两数值的百分比差异并输出指定格式数据框

R 同分组数值两两百分比差异计算实现

自定义核心计算函数

首先定义百分比差异计算的独立函数:

calc_perc_diff <- function(x, y) {
  abs(x - y) / ((x + y) / 2) * 100
}

加载示例数据

你提供的示例数据导入代码:

df <- structure(list(Levelname = c("B 1", "B 2", "B 3", 
"B 4", "D 1", "D 2", "D 3", "D 4"), y = c(0.679428655093332, 
1.07554328679719, 0.883000346050764, 0.791772867506205, 0.538143790501689, 
0.805122127560562, 0.591353204313314, 0.795225886492002), fill = c("midnightblue", 
"dodgerblue4", "steelblue3", "lightskyblue", "midnightblue", 
"dodgerblue4", "steelblue3", "lightskyblue"), species = c("White Grunt", 
"White Grunt", "White Grunt", "White Grunt", "White Grunt", "White Grunt", 
"White Grunt", "White Grunt")), row.names = c(NA, -8L), class = "data.frame")

按分组计算的完整实现(包含for循环+apply逻辑)

# 提取分组标识(Levelname首字母B/D为分组依据)
df$group <- substr(df$Levelname, 1, 1)
# 初始化结果数据框
result <- data.frame(
  Pair = character(),
  `Percent Difference` = numeric(),
  check.names = FALSE,
  stringsAsFactors = FALSE
)
# 遍历所有分组
for (g in unique(df$group)) {
  # 提取当前分组的子集
  sub_data <- df[df$group == g, ]
  # 生成当前分组内所有两两不重复的索引组合
  comb_index <- combn(nrow(sub_data), 2)
  # 用apply遍历每一组组合计算差异
  group_calc <- apply(comb_index, 2, function(idx) {
    pair_name <- paste(sub_data$Levelname[idx[1]], "-", sub_data$Levelname[idx[2]])
    diff_val <- calc_perc_diff(sub_data$y[idx[1]], sub_data$y[idx[2]])
    return(c(pair_name, round(diff_val, 3)))
  })
  # 把当前分组计算结果合并到总结果
  result <- rbind(result, data.frame(
    Pair = group_calc[1, ],
    `Percent Difference` = as.numeric(group_calc[2, ]),
    check.names = FALSE,
    stringsAsFactors = FALSE
  ))
}
# 打印输出结果
print(result)

输出效果

运行后得到的结果和你要求的格式完全一致,第一行B 1 - B 2的计算结果为45.142,和你给出的示例计算结果完全匹配。

内容的提问来源于stack exchange,提问作者Johnny5ish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:24:03