如果你制作了一个命名列表,你可以将它传递给cross_df:
library(purrr)
list(stores = 1:20, weeks = 1:104) %>% cross_df()
#> # A tibble: 2,080 x 2
#> stores weeks
#> <int> <int>
#> 1 1 1
#> 2 2 1
#> 3 3 1
#> 4 4 1
#> 5 5 1
#> 6 6 1
#> 7 7 1
#> 8 8 1
#> 9 9 1
#> 10 10 1
#> # ... with 2,070 more rows
您可以使用cross2,但之后您需要将其强制转换为数据框。主要问题是生成的列表元素没有名称,因此您需要重新添加它们以强制到数据框,例如
stores <- 1:20
weeks <- 1:104
cross2(stores, weeks) %>% map_df(set_names, c('stores', 'weeks'))
更长的解释是cross2 对传递给它的向量进行笛卡尔(交叉)连接,而cross 对传递给它的列表中的元素做同样的事情。 cross_df 是 cross 的一个版本,之后简化为数据框,与 map_df 平行。
另外值得注意的是,base R 已经有一个出色的功能,可以在expand.grid 中进行交叉连接和获取数据框:
df <- expand.grid(stores = stores, weeks = weeks)
head(df)
#> stores weeks
#> 1 1 1
#> 2 2 1
#> 3 3 1
#> 4 4 1
#> 5 5 1
#> 6 6 1
如果你传入向量,如果你想保留名字,你必须给它们命名,但它也会采用像cross这样的命名列表,并保留它的名字,例如
df <- list(stores = 1:20, weeks = 1:104) %>% expand.grid()
所有结果都是一样的,除了 expand.grid 返回一个 vanilla data.frame 而不是 tibble。