You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()函数获取每个交易的下一个产品,最后统计每一组产品流转的次数:

  1. 先加载dplyr包(未安装的话先执行install.packages("dplyr"))
  2. 执行以下数据处理代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:05:13