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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:43