如何用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
相关产品推荐
相关产品推荐

