我想我误解了purrr::cross_df()应该如何工作。
举个例子,假设我有20家商店,104周。我想做一个有商店和几个星期作为专栏的tibble。由此产生的tibble应该是2列乘20*104行,以表示所有存储周。
我处理这件事的方式
stores <- 1:20
weeks <- 1:104
cross2(stores,weeks) 问题是,我希望这是一个泰伯,而不是名单。我尝试用cross替换cross_df,但没有取得任何成功。
发布于 2018-01-13 22:34:23
如果您创建了一个命名列表,则可以将其传递到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并行。
还值得注意的是,基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返回的是普通的data.frame而不是tibble。
https://stackoverflow.com/questions/48244855
复制相似问题