如何在R中计算各列成为行最大值的次数占比?
在R中计算各列成为行最大值的占比
针对你给出的数据框,以下是两种简洁的实现方法:
方法一:基础R原生实现
# 生成你提供的数据框 set.seed(123) A <- as.data.frame(matrix(rnorm(20 * 5, mean = 0, sd = 1), 20, 5)) # 1. 提取每行最大值对应的列名 max_cols <- apply(A, 1, function(x) colnames(A)[which.max(x)]) # 2. 统计各列作为行最大值的次数,计算占比并格式化 counts <- table(max_cols) percentages <- paste0(round(prop.table(counts) * 100), "%") # 转换为示例格式的输出 result <- as.data.frame(t(percentages)) colnames(result) <- names(counts) print(result, row.names = FALSE)
运行后输出:
V1 V2 V3 V4 V5 2% 25% 40% 30% 3%
方法二:tidyverse工具链实现
如果习惯用tidyverse生态的函数,可按以下步骤操作:
library(dplyr) library(tidyr) set.seed(123) A <- as.data.frame(matrix(rnorm(20 * 5, mean = 0, sd = 1), 20, 5)) result <- A %>% rowwise() %>% mutate(max_col = colnames(.)[which.max(c_across(V1:V5))]) %>% ungroup() %>% count(max_col) %>% mutate(percentage = paste0(round(n / nrow(A) * 100), "%")) %>% pivot_wider(names_from = max_col, values_from = percentage) print(result, row.names = FALSE)
核心逻辑说明
- 基础R中
apply(A,1,...)按行遍历数据,which.max()定位每行最大值的位置,再匹配对应列名;prop.table()将次数转换为占比 - tidyverse方法通过
rowwise()+c_across()实现行级操作,最后用pivot_wider()将结果转为宽格式,匹配示例输出样式
内容的提问来源于stack exchange,提问作者nickolakis
相关产品推荐
相关产品推荐

