R语言实现dataframe列最大值提取、对应值匹配及频次统计
R环境下tibble数据集两类统计需求实现方案
两个需求均可在R环境下直接实现,以下为可复用的代码方案,优先提供第一类汇总表的实现方法。
第一类需求:逐时间列返回最大值及对应人员姓名
实现逻辑:遍历所有24个格式为「月份_年份」的时间列(对应数据集列索引2-25),逐列计算最大值,匹配取到该值对应的Full.Name字段,最终合并为规整汇总表。
# 加载适配tibble处理的tidyverse工具包 library(tidyverse) # 替换your_data为你实际的数据集变量名,可直接赋值dput读入的对象 your_data <- # 提取所有时间列的列名 time_columns <- colnames(your_data)[2:25] # 生成汇总表 max_value_summary <- map_dfr(time_columns, function(current_col){ # 计算当前列的最大值,自动忽略缺失值 current_max <- max(your_data[[current_col]], na.rm = TRUE) # 匹配最大值对应的人员姓名,若存在并列最大值则用分号拼接多个姓名 matched_names <- your_data %>% filter(.data[[current_col]] == current_max) %>% pull(Full.Name) %>% paste(collapse = "; ") # 返回单条统计结果 tibble( 时间列名 = current_col, 列最大值 = current_max, 最大值对应人员 = matched_names ) }) # 打印查看结果 print(max_value_summary)
注:若单个时间列存在多人同时取得最大值的情况,代码会自动拼接所有符合条件的人员姓名,不会遗漏结果。
第二类需求:统计每位人员取得列最大值的总次数
实现逻辑:先将宽格式数据集转为长格式,按每个时间列分组标记取得最大值的记录,再按人员维度聚合计数即可。
# 生成最大值次数统计结果 max_count_summary <- your_data %>% # 宽转长,把所有时间列整合为两列:时间维度名、对应数值 pivot_longer( cols = all_of(time_columns), names_to = "时间列名", values_to = "指标值" ) %>% # 按单个时间列分组,标记当前组内的最大值记录 group_by(时间列名) %>% mutate(is_max = as.integer(指标值 == max(指标值, na.rm = TRUE))) %>% ungroup() %>% # 按人员分组统计总次数 group_by(Full.Name) %>% summarise(取得最大值总次数 = sum(is_max, na.rm = TRUE)) %>% # 按次数从高到低排序 arrange(desc(取得最大值总次数)) # 打印查看结果 print(max_count_summary)
注:并列最大值场景下,所有取得最大值的人员都会累计1次计数,结果不会出现偏差。
内容的提问来源于stack exchange,提问作者Yeezus
相关产品推荐
相关产品推荐

