如何统计R语言DataFrame中用户活动路径的唯一出现次数?
R语言会话路径统计实现
我有如下简化版的DataFrame:
df <- data.frame(ID = rep('A',7), Activity = c('Login','Login','cat1','Login','cat2','Login','Login'))
原始数据结构:
ID Activity 1 A Login 2 A Login 3 A cat1 4 A Login 5 A cat2 6 A Login 7 A Login
需求说明
- 从第一行开始处理
- 初始化
session=0 - 创建包含
path和count字段的结果DataFrame - 当
Activity为Login时开启新会话(session递增),记录当前会话内的所有Activity直到下一个Login出现,形成一条路径 - 重复上述操作,最终统计各路径的出现次数
预期输出
Path count 1 Login 3 2 Login, cat1 1 3 Login, cat2 1
解决方案
方法1:使用dplyr包(简洁高效)
library(dplyr) # 标记会话:每遇到Login就生成新的会话ID df <- df %>% mutate(session = cumsum(Activity == "Login")) # 按会话分组拼接路径,再统计频次 result <- df %>% group_by(session) %>% summarise(Path = paste(Activity, collapse = ", ")) %>% ungroup() %>% count(Path, name = "count") # 输出结果 print(result)
方法2:Base R实现(无依赖)
# 生成会话ID session_ids <- cumsum(df$Activity == "Login") # 按会话分组拼接路径 path_list <- tapply(df$Activity, session_ids, function(x) paste(x, collapse = ", ")) # 统计路径频次并转换为DataFrame result <- as.data.frame(table(path_list), stringsAsFactors = FALSE) colnames(result) <- c("Path", "count") # 输出结果 print(result)
两种方法核心逻辑一致:通过cumsum(Activity == "Login")标记每个会话的边界,对会话内的Activity进行拼接后,统计各路径的出现次数,均可得到预期结果。
内容的提问来源于stack exchange,提问作者H_A
相关产品推荐
相关产品推荐

