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

R语言:按factor分组筛选sessions前两大值并计算V1均值

按分组筛选最大Sessions并计算V1均值

原始数据构建代码

v=c(1, 2, 3)
df <- data.frame(V1 = randomNumbers(n = 18,min = 0,max = 1, col=1),
                 factor_col = c(rep("A", 18)),
                 sessions = rep(v, each=6))

v=c(1, 2, 3, 4, 5, 6, 7, 8)
df2 <- data.frame(V1 = randomNumbers(n = 24,min = 0,max = 1, col=1),
                  factor_col = c(rep("B", 24)),
                  sessions = rep(v, each=3))

v=c(1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12)
df3 <- data.frame(V1 = randomNumbers(n = 33,min = 0,max = 1, col=1),
                  factor_col = c(rep("C", 33)),
                  sessions = rep(v, each=3))

Table = bind_rows(df, df2)
Table = bind_rows(Table, df3)

需求说明

按factor_col的每个因子分组,筛选每组中sessions的两个最大值对应的所有记录,计算这些记录中V1的平均值。

实现方案(基于dplyr)

这里使用tidyverse生态的dplyr包完成操作,适配你已有的数据处理习惯:

library(dplyr)

# 方案一:通过排名直接筛选目标记录
result <- Table %>%
  group_by(factor_col) %>%
  # 对每组sessions按降序排名,相同值获得相同排名
  mutate(top_sessions_rank = dense_rank(desc(sessions))) %>%
  # 保留排名前2的sessions对应的所有记录
  filter(top_sessions_rank <= 2) %>%
  # 计算每组筛选后V1的平均值
  summarise(avg_V1 = mean(V1, na.rm = TRUE)) %>%
  ungroup()

print(result)

如果需要先明确提取每组的前两大唯一sessions值再筛选,可使用以下方案:

# 方案二:先提取目标sessions值再关联计算
result <- Table %>%
  group_by(factor_col) %>%
  # 提取每组前两大的唯一sessions值,存入列表
  summarise(top_two_sessions = list(unique(sort(sessions, decreasing = TRUE)[1:2])),
            .groups = "drop") %>%
  # 展开列表为行
  unnest(top_two_sessions) %>%
  # 关联原始数据筛选对应记录
  left_join(Table, by = c("factor_col", "top_two_sessions" = "sessions")) %>%
  group_by(factor_col) %>%
  # 计算均值
  summarise(avg_V1 = mean(V1, na.rm = TRUE))

print(result)

方案说明

  • 方案一的dense_rank会给相同sessions值赋予相同排名,确保同一最大sessions值的所有记录都被纳入计算,比如组A中sessions=3的6条记录都会被保留。
  • 方案二更直观地先锁定目标sessions值,适合需要明确查看筛选依据的场景。

内容的提问来源于stack exchange,提问作者Chiara Toschi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:13:14