R语言按用户分组统计登录字符串出现次数生成会话编号问题
现有代码问题
- mutate方法不支持直接传入for循环作为赋值逻辑,它要求输入的计算结果是与分组行数等长的向量
- 循环内部每次迭代都会重置
i=0,无法实现累计计数的效果 - 循环遍历的是外部对象
PinnacleActivityLog,没有调用当前分组内的type列数据,逻辑不匹配 - 没有提前对每个用户的行为按时间排序,若原始数据顺序混乱会导致会话计数完全错误
可用实现方案
首先需要加载tidyverse套件(包含dplyr、stringr等所需工具),实现逻辑直接用累计求和替代手动循环,和你给出的伪代码逻辑完全一致:
library(tidyverse) # 示例数据加载 table <- data.frame( userid = c("111", "111", "111", "111", "111", "111", "111", "111", "222", "222", "222", "111", "111", "222", "222", "222"), timestamp = c("11/2/2020 15:26", "11/2/2020 15:56", "11/2/2020 15:56", "11/2/2020 16:30", "11/2/2020 17:43", "11/2/2020 19:05", "11/4/2020 19:15", "11/4/2020 20:05", "11/3/2020 19:23", "11/3/2020 19:50", "11/3/2020 20:15", "11/4/2020 22:25", "11/4/2020 22:45", "11/5/2020 12:45", "11/5/2020 12:50", "11/5/2020 12:55"), type = c("Log In", "Search", "Click", "Click", "Search", "Log Out", "Log In", "Log Out", "Log In", "Search", "Log Out", "Log In", "Log Out", "Log In", "Click", "Log Out") ) # 会话编号计算 result <- table %>% # 转换时间格式,避免字符串排序出错 mutate(timestamp = as.POSIXct(timestamp, format = "%m/%d/%Y %H:%M")) %>% # 按用户+时间排序,保证行为序列顺序正确 arrange(userid, timestamp) %>% group_by(userid) %>% # 每遇到一次Log In就计数+1,累计结果就是会话编号 mutate(Session_List = cumsum(type == "Log In")) %>% ungroup()
运行后得到的result就和你预期的输出完全一致,用户111会有3次会话,用户222会有2次会话,同一会话内的所有行为编号相同。
内容的提问来源于stack exchange,提问作者arhomberg
相关产品推荐
相关产品推荐

