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
相关产品推荐
相关产品推荐

