首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cross2() vs cross_df()使用purrr制作tibble

cross2() vs cross_df()使用purrr制作tibble
EN

Stack Overflow用户
提问于 2018-01-13 22:27:26
回答 1查看 2K关注 0票数 3

我想我误解了purrr::cross_df()应该如何工作。

举个例子,假设我有20家商店,104周。我想做一个有商店和几个星期作为专栏的tibble。由此产生的tibble应该是2列乘20*104行,以表示所有存储周。

我处理这件事的方式

代码语言:javascript
复制
stores <- 1:20
weeks <- 1:104
cross2(stores,weeks) 

问题是,我希望这是一个泰伯,而不是名单。我尝试用cross替换cross_df,但没有取得任何成功。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-13 22:34:23

如果您创建了一个命名列表,则可以将其传递到cross_df

代码语言:javascript
复制
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,但之后需要将其强制到数据帧中。主要的问题是,结果列表元素没有名称,因此您需要重新添加它们以强制进入数据框架。

代码语言:javascript
复制
stores <- 1:20
weeks <- 1:104

cross2(stores, weeks) %>% map_df(set_names, c('stores', 'weeks'))

更长的解释是,cross2对传递给它的向量进行笛卡儿(交叉)连接,而cross对传递它的列表中的元素做同样的操作。cross_dfcross的一个版本,它后来简化为数据帧,并与map_df并行。

还值得注意的是,基R已经具有在expand.grid中进行交叉连接和获取数据帧的出色功能。

代码语言:javascript
复制
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一样的命名列表,并且保留它的名字。

代码语言:javascript
复制
df <- list(stores = 1:20, weeks = 1:104) %>% expand.grid()

所有结果都是相同的,但expand.grid返回的是普通的data.frame而不是tibble。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48244855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档