You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者匿名

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:35:33