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
相关产品推荐
相关产品推荐

