R语言按ID分组选取VAR众数对应CATEGORY众数的实现方法
首先先定义通用的众数计算函数,R基础包没有内置众数函数,我们手动实现一个,默认出现频率相同的情况下取最先出现的数值:
get_mode <- function(x) { ux <- unique(x) ux[which.max(tabulate(match(x, ux)))] }
方案1:dplyr实现(适合习惯tidy语法的场景)
library(dplyr) result <- DATA %>% # 按ID分组 group_by(ID) %>% # 生成当前ID对应的VAR列众数 mutate(VAR_mode = get_mode(VAR)) %>% # 仅保留当前ID下VAR等于众数的行 filter(VAR == VAR_mode) %>% # 汇总得到每个ID的最终结果 summarise( TEXTS = first(VAR_mode), category = get_mode(CATEGORY) )
方案2:data.table实现(更适合大数据量场景,85万行处理速度更快)
library(data.table) # 将数据框转为data.table格式 setDT(DATA) result <- DATA[, # 按ID分组计算VAR列众数 VAR_mode := get_mode(VAR), by = ID ][ # 筛选出VAR等于众数的行 VAR == VAR_mode, # 按ID分组计算CATEGORY列众数,汇总结果 .(TEXTS = first(VAR_mode), category = get_mode(CATEGORY)), by = ID ]
两种方案跑你提供的示例数据,都能得到你要求的输出结果。如果需要处理多个众数并列的逻辑,调整get_mode函数的返回规则即可。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

