如何在R中按ID分组获取唯一choice值的最大出现次数?
在R中按ID分组获取每个组内出现次数最多的choice及其次数
问题场景
我有一个经pivot_longer()处理后的dataframe,包含ID、trial、choice字段,数据示例如下:
ID trial choice 1 1 A 1 2 A 1 3 B 1 4 C 1 5 A 2 1 A 2 2 B 2 3 B 2 4 B 2 5 C 3 1 A 3 2 A 3 3 A 3 4 A 3 5 C ...
需要按ID分组,得到每个组内出现次数最多的choice值及其对应次数,理想输出格式如下:
ID max_choice max_time 1 A 3 2 B 3 3 A 4
解决方案
方法1:用tidyverse工具链(推荐)
这是最常用的管道式处理方式,步骤清晰直观:
library(dplyr) # 假设你的数据框名为df result <- df %>% group_by(ID, choice) %>% tally(name = "max_time") %>% # 按ID+choice分组,统计出现次数 slice_max(n = 1, order_by = max_time) %>% # 每个ID取次数最多的行 ungroup() %>% rename(max_choice = choice) %>% # 把choice列改名为max_choice select(ID, max_choice, max_time) # 调整列顺序到目标格式 print(result)
补充说明:
- 如果同一个ID下有多个choice出现次数相同(比如某ID的A和B都出现2次),
slice_max会把这些行都保留;要是只想留其中一个,加个参数with_ties = FALSE就行。
方法2:用base R(无需额外包)
不想加载外部包的话,用base R的函数也能实现:
# 假设数据框名为df # 第一步:按ID和choice分组计数 counts <- aggregate(trial ~ ID + choice, data = df, FUN = length) colnames(counts)[3] <- "max_time" # 第二步:每个ID筛选出次数最多的行 result <- do.call(rbind, lapply(split(counts, counts$ID), function(sub_df) { sub_df[sub_df$max_time == max(sub_df$max_time), ] })) # 第三步:整理列名和格式 result <- result[, c("ID", "choice", "max_time")] colnames(result)[2] <- "max_choice" rownames(result) <- NULL # 去掉自动生成的行名 print(result)
内容的提问来源于stack exchange,提问作者匿名
相关产品推荐
相关产品推荐

