如何用R的dplyr将交易数据转换为‘来源/目标’表?
用dplyr实现用户交易产品流转次数统计
原始数据
我们有如下用户交易日志数据:
sales <- data.frame( MBR_ID = c(1,1,1,2,2,2,2,3,3,3,3), DATE = as.Date(c('2020-01-01','2020-02-01','2020-03-01','2020-01-01','2020-02-01','2020-03-01','2020-04-01','2020-04-01','2020-04-02','2020-04-03','2020-04-04')), PROD = c('A','B','C','A','C','A','A','A','B','C','D'))
需求目标
按MBR_ID分组,基于DATE的时间顺序,统计每个用户从一个产品到下一个产品的交易流转次数,最终得到如下格式的结果:
edges <- data.frame( from=c("A","B","A","C","A","C"), to=c("B","C","C","A","A","D"), value=c(2,2,1,1,1,1))
实现步骤(使用dplyr)
核心思路是先按用户分组并按时间排序,用lead()函数获取每个交易的下一个产品,最后统计每一组产品流转的次数:
- 先加载dplyr包(未安装的话先执行
install.packages("dplyr")) - 执行以下数据处理代码:
library(dplyr) edges_result <- sales %>% # 按用户ID分组 group_by(MBR_ID) %>% # 按交易日期排序,确保流转顺序符合时间逻辑 arrange(DATE, .by_group = TRUE) %>% # 生成流转对:当前产品为from,下一个产品为to mutate(from = PROD, to = lead(PROD)) %>% # 过滤掉每个用户的最后一条记录(无后续产品可流转) filter(!is.na(to)) %>% # 取消用户分组,转为按流转对统计次数 ungroup() %>% group_by(from, to) %>% summarise(value = n(), .groups = "drop") # 查看最终结果 edges_result
执行后得到的结果与目标edges完全一致:
# A tibble: 6 × 3 from to value <chr> <chr> <int> 1 A B 2 2 A C 1 3 A A 1 4 B C 2 5 C A 1 6 C D 1
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

