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

如何用dplyr重塑购物篮DataFrame以适配自定义函数输入格式

解决购物篮数据集格式转换问题

嘿,我来帮你搞定这个购物篮格式转换的问题!结合你提到的需求——把购物篮数据转换成适配自定义函数的格式(最大容量5),我用dplyr+tidyr给你写了一套可行的方案,先从模拟样本数据开始讲起:

第一步:模拟样本数据

假设你的原始购物篮数据是长格式的(每个商品占一行),像这样:

library(dplyr)
library(tidyr)

# 模拟你的购物篮样本数据
basket_data <- tibble(
  basket_id = c(1, 1, 1, 2, 2),
  item = c("苹果", "香蕉", "橙子", "牛奶", "面包"),
  quantity = c(2, 1, 3, 4, 2)
)

第二步:格式转换代码

我们的目标是把每个购物篮转成一行,包含最多5组「商品+数量」的列(item1/qty1到item5/qty5),不足5个商品的位置用默认值填充:

formatted_basket <- basket_data %>%
  # 给每个购物篮内的商品按顺序编号,最多保留前5个
  group_by(basket_id) %>%
  mutate(item_seq = row_number()) %>%
  filter(item_seq <= 5) %>%
  ungroup() %>%
  # 转宽格式,生成item1、quantity1这类对应列
  pivot_wider(
    id_cols = basket_id,
    names_from = item_seq,
    values_from = c(item, quantity),
    names_glue = "{.value}{item_seq}",
    # 空值填充规则:商品用空字符串,数量用0(可按需调整)
    values_fill = list(item = "", quantity = 0)
  ) %>%
  # 确保强制生成到item5和quantity5(避免商品不足时缺列)
  mutate(
    across(paste0("item", 1:5), ~replace_na(., "")),
    across(paste0("quantity", 1:5), ~replace_na(., 0))
  )

# 查看转换结果
print(formatted_basket)

代码逻辑说明

  • 编号与过滤:先给每个购物篮里的商品编序号,同时过滤掉超过第5个的商品,保证符合最大容量限制;
  • 转宽格式:用pivot_wider把长数据转成宽数据,通过names_glue自动生成item1、quantity1这类规范列名;
  • 空值处理:用values_fill和replace_na确保所有5个商品位置都有值,避免因为购物篮商品数量不足导致自定义函数报错。

如果你的自定义函数需要的是其他格式(比如把商品和数量打包成列表),可以告诉我具体要求,我再帮你调整代码~

内容的提问来源于stack exchange,提问作者Milad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:28:26