关于purrr中cross2()与cross_df()生成tibble的用法疑问
解决purrr::cross_df()生成门店-周组合tibble的问题
我完全懂你的困惑!purrr::cross_df()的用法和cross2()确实有区别,你之前没成功的原因是没有给它传入命名列表——这是cross_df生成带列名tibble的关键要求。
正确的cross_df用法
cross_df()需要接收一个命名的列表,列表里的每个元素对应你要生成的列,元素名就是最终tibble的列名。针对你的需求,代码应该是这样:
library(purrr) library(tibble) # 定义你的门店和周数据 stores <- 1:20 weeks <- 1:104 # 传入命名列表给cross_df store_week_combinations <- cross_df(list( stores = stores, weeks = weeks )) # 验证结果 head(store_week_combinations) #> # A tibble: 6 × 2 #> stores weeks #> <int> <int> #> 1 1 1 #> 2 1 2 #> 3 1 3 #> 4 1 4 #> 5 1 5 #> 6 1 6 nrow(store_week_combinations) # 输出2080,正好是20*104的结果
为什么之前的cross2不行?
cross2()的作用是生成两个向量的所有组合的列表,每个列表元素是一个长度为2的向量(比如c(1,1)、c(1,2)),但它不会自动转换成带列名的tibble。而cross_df()本质是把多个向量的笛卡尔积直接整理成结构化的tibble,前提是你要告诉它每个变量的名字。
额外推荐:tidyr::expand_grid()
如果你用tidyverse工具链,tidyr::expand_grid()可能更直观,它专门用来生成变量的笛卡尔积tibble,用法更简洁:
library(tidyr) store_week_combinations <- expand_grid(stores = stores, weeks = weeks)
这个方法和cross_df效果完全一致,写法更贴近日常的tibble创建逻辑。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

