R语言中处理多购买项行程:判断下一行程是否为指定零售商
解决同一行程多记录的下行程标记问题
我来帮你搞定这个问题!你遇到的核心问题是:原代码用lead()是逐行处理的,但同一Trip ID下的多条记录属于同一个行程,所以需要基于行程而非单条记录来判断下一行程是否在目标零售商消费,再把这个标记同步给该行程的所有记录。
解决思路
- 先提取行程级别的数据:每个家庭的每个行程(唯一
Trip ID)对应一个零售商(同一行程的零售商应该是一致的,如果不一致可以先做统一处理)。 - 在家庭分组下,用
lead()获取每个行程的下一行程零售商,判断是否为目标值,生成行程级的标记(1或0)。 - 把行程级的标记关联回原始数据集,这样同一
Trip ID的所有记录都会得到相同的标记。
具体代码实现
首先定义你的目标零售商:
target_retailer <- 11024 # 替换成你的目标零售商ID
步骤1:生成行程级标记数据
library(dplyr) # 先整理每个家庭-行程的唯一零售商信息 trip_level_data <- e1 %>% # 按家庭和行程分组,提取该行程的零售商(这里用first(),如果需要可以换成mode等逻辑) group_by(Household, Trip_ID) %>% summarise(trip_retailer = first(retailer), .groups = "drop") %>% # 按家庭分组,获取下一行程的零售商并生成标记 group_by(Household) %>% mutate( next_trip_retailer = lead(trip_retailer, default = 0), # 判断下一行程是否是目标零售商,生成标记 dummy = ifelse(next_trip_retailer == target_retailer, 1, 0) ) %>% ungroup()
步骤2:关联标记回原始数据集
# 将行程级标记关联回原始数据,同一Trip ID的所有记录会得到相同的dummy值 e1_final <- e1 %>% left_join( trip_level_data %>% select(Household, Trip_ID, dummy), by = c("Household", "Trip_ID") )
补充说明
- 如果你的同一
Trip ID内确实存在不同零售商的情况,你可以把summarise里的first(retailer)换成适合的逻辑,比如取出现次数最多的零售商(mode),或者根据业务规则选择主要零售商。 - 原代码的问题在于直接对每行用
lead(),导致同一行程的不同记录可能取到不同的下一行程值(比如行程最后一条记录的lead是下一行程的第一条,但行程中间的记录lead是同一行程的下一条),而我们需要的是整个行程的下一个行程,所以必须先聚合到行程级别再处理。
内容的提问来源于stack exchange,提问作者Rajan Mishra
相关产品推荐
相关产品推荐

