如何将含会话与动作的分组DataFrame转换为arules事务格式
把会话-动作DataFrame转成arules能用的事务格式
嘿,我刚好处理过类似的需求,这就一步步教你怎么弄~首先得明确:你关注动作的发生顺序,但要注意,标准的apriori算法是处理无顺序的项集的,如果要分析带顺序的序列关联,得用arulesSequences包的序列挖掘工具,我会同时覆盖这两种场景:
1. 转成无顺序事务(适配apriori)
这种情况会把每个会话里的重复动作去重,变成一个项集合,适合普通的关联规则分析。
具体步骤:
- 先加载
dplyr(用来分组聚合数据)和arules(处理事务)这两个包; - 按
session分组,把每个会话的动作合并成列表,顺便去重; - 把列表转成arules认可的事务对象。
直接上代码:
# 加载需要的包 library(dplyr) library(arules) # 你的原始数据 x <- data.frame( session=c("01","01","01","02","02", "02","03","03"), action=c("a","b","a","c","a","c", "a","b") ) # 按session分组,聚合动作成去重的列表 transactions_list <- x %>% group_by(session) %>% summarise(items = list(unique(action))) %>% # unique()去掉重复动作 pull(items) # 提取出列表格式的列 # 转成事务对象 transactions <- as(transactions_list, "transactions") # 看看转换后的结果 inspect(transactions)
运行后你会看到这样的输出,每个会话对应一个无顺序的项集:
items transactionID [1] {a,b} 01 [2] {a,c} 02 [3] {a,b} 03
2. 保留动作顺序的序列格式(适配序列关联规则)
既然你在意动作的发生顺序(比如会话01的a->b->a),那标准apriori就不太合适了,得用arulesSequences包来做序列挖掘,它能保留动作的先后顺序。
操作步骤:
- 加载
arulesSequences包; - 按
session分组,保留原始动作顺序(不去重); - 转成序列事务对象。
代码示例:
library(arulesSequences) # 按session分组,保留动作的原始顺序(不去重) sequence_list <- x %>% group_by(session) %>% summarise(items = list(action)) %>% pull(items) # 转成序列事务对象 sequence_transactions <- as(sequence_list, "timedsequences") # 查看保留顺序的结果 inspect(sequence_transactions)
输出会完整保留每个会话的动作序列:
items transactionID [1] <a,b,a> 01 [2] <c,a,c> 02 [3] <a,b> 03
之后你就可以用对应的算法分析了:
- 无顺序事务用
apriori()挖掘关联规则:
rules <- apriori(transactions, parameter = list(supp = 0.5, conf = 0.8)) inspect(rules)
- 带顺序的序列用
cspade()挖掘序列关联规则:
seq_rules <- cspade(sequence_transactions, parameter = list(support = 0.5)) inspect(seq_rules)
小提醒
- 要是动作顺序对你的分析很关键,千万别用apriori,它完全不考虑顺序,序列挖掘才是正确的选择;
- 转换前一定要确保你的数据是按会话内动作的实际发生顺序排列的,不然序列分析结果会出错哦。
内容的提问来源于stack exchange,提问作者marqui
相关产品推荐
相关产品推荐

