R语言统计数据框各列取行最大值的观测占比方法
需求说明
R语言数据处理场景中,待处理数据集的每条观测包含volume_1、volume_2、volume_3三个体积数值字段,不同观测下三个字段的数值大小无固定排序规律,需要分别统计三类观测占总观测数的百分比:
volume_1为所在行三个体积字段最大值的观测占比volume_2为所在行三个体积字段最大值的观测占比volume_3为所在行三个体积字段最大值的观测占比
示例测试数据如下:
df <- structure(list(PVC = c("29A", "2D5", "2HX", "38A", "3CN", "6021051" ), Age = c(6, 5, 6, 10, 5, 7), volume_1 = c(59.44244884, 51.69518257, 63.17950819, 56.4269955, 64.05189184, 61.82983473), volume_2 = c(54.74897726, 56.64778447, 51.86880673, 59.71146472, 58.96633234, 63.39471043 ), volume_3 = c(58.97596791, 51.75711362, 61.36142512, 57.09629745, 64.25164825, 63.19407463), Year = c("2003", "2002", "2003", "2008", "2003", "1994"), averageAB = c(57.09571305, 54.17148352, 57.52415746, 58.06923011, 61.50911209, 62.61227258), diff_AB_C = c(-1.88025486, 2.4143699, -3.83726766, 0.972932659999998, -2.74253616, -0.58180205 ), sumAB = c(114.1914261, 108.34296704, 115.04831492, 116.13846022, 123.01822418, 125.22454516), ratioAB_C = c(1.93623657477333, 2.09329615703558, 1.87492899154491, 2.03408041163622, 1.91463141461122, 1.98158681637776)), row.names = c(NA, 6L), class = "data.frame")
实现思路
- 先筛选出三个体积字段的列子集,逐行定位最大值对应的字段
- 统计三个字段作为行最大值的出现频次
- 用频次除以总观测数,乘以100得到百分比结果
- 注意:若存在多个字段数值相等且同为行最大值的场景,可根据业务规则调整计数逻辑,以下代码默认取第一个出现的最大值对应字段
实现代码
基础R实现(无需安装加载第三方包)
直接用内置函数max.col完成逐行最大值定位,计算效率高,适合大数据量场景:
# 指定要计算的三个体积列名 vol_cols <- c("volume_1", "volume_2", "volume_3") # 逐行获取最大值对应的列索引 max_col_pos <- max.col(df[vol_cols]) # 转换为对应的列名 max_col_name <- vol_cols[max_col_pos] # 计算各字段作为最大值的占比(百分比) perc_result <- table(max_col_name) / nrow(df) * 100 # 打印结果 print(perc_result)
示例数据运行输出:
max_col_name volume_1 volume_2 volume_3 33.33333 50.00000 16.66667
dplyr实现(适配管道操作工作流)
如果日常数据处理用tidyverse系列包,可以用逐行计算的方式实现,逻辑更直观:
library(dplyr) perc_result <- df %>% rowwise() %>% # 逐行判断最大值对应的字段名 mutate(max_vol = vol_cols[which.max(c(volume_1, volume_2, volume_3))]) %>% ungroup() %>% # 统计频次并计算百分比 count(max_vol, name = "count") %>% mutate(percentage = count / sum(count) * 100) print(perc_result)
内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

