计算各分组中含特定记录的session占总session的比例(R语言)
问题:计算用户含特定操作的会话占比
需求:统计每个用户下至少包含1条action=='p'的会话数量,再计算该数量与用户总会话数(即该用户的max(session))的比值,同时已通过代码添加辅助列session_with_p标记对应会话是否包含'p'操作。
原始数据集
df<-read.table(text=" user session action 1 1 'v' 1 1 'v' 1 1 'v' 1 2 'd' 1 2 'p' 1 2 'p' 1 3 'p' 2 1 'v' 2 1 'p' 2 2 'v'",header=T,stringsAsFactors = F)
已完成的代码步骤
df <- df %>% group_by(user, session) %>% mutate(session_with_p = any(action == "p"))
期望结果
需要得到包含ratio_session_posting列的数据集,示例如下:
| user | session | action | session_with_p | ratio_session_posting |
|---|---|---|---|---|
| 1 | 1 | 'v' | F | 2/3 |
| 1 | 1 | 'v' | F | 2/3 (0.67) |
| 1 | 1 | 'v' | F | 2/3 |
| 1 | 2 | 'd' | T | 2/3 |
| 1 | 2 | 'p' | T | 2/3 |
| 1 | 2 | 'p' | T | 2/3 |
| 1 | 3 | 'p' | T | 2/3 |
| 2 | 1 | 'v' | T | 1/2 |
| 2 | 1 | 'p' | T | 1/2 |
| 2 | 2 | 'v' | F | 1/2 |
解决方案代码
library(dplyr) df_result <- df %>% # 保留原有的会话标记步骤 group_by(user, session) %>% mutate(session_with_p = any(action == "p")) %>% # 按用户分组计算占比 group_by(user) %>% mutate( # 计算用户总会话数 total_sessions = max(session), # 统计含p操作的会话数量(去重计数) sessions_with_p = n_distinct(session[session_with_p]), # 生成分数形式的占比 ratio_session_posting = paste0(sessions_with_p, "/", total_sessions), # 可选:在每组第一行添加小数格式(匹配示例中的显示) ratio_session_posting = if_else(row_number() == 1, paste0(ratio_session_posting, " (", round(sessions_with_p/total_sessions, 2), ")"), ratio_session_posting) ) %>% # 取消分组,移除中间辅助列 ungroup() %>% select(-total_sessions, -sessions_with_p) # 查看结果 print(df_result)
代码说明
- 先按
user和session分组,用any(action == "p")标记该会话是否包含'p'操作,生成session_with_p列; - 切换到按
user分组,计算两个核心指标:total_sessions:用户的总会话数,用max(session)获取;sessions_with_p:筛选出标记为TRUE的会话,通过n_distinct去重计数得到含'p'的会话数量;
- 生成
ratio_session_posting列,默认显示为分数格式,同时可选在每组的第一行添加括号包裹的小数近似值(如示例中的2/3 (0.67)); - 最后取消分组并移除中间辅助列,得到符合需求的结果集。
内容的提问来源于stack exchange,提问作者Cina
相关产品推荐
相关产品推荐

