【问题标题】:cross2() vs cross_df() to make a tibble with purrrcross2() 与 cross_df() 用 purrr 制作一个 tibble
【发布时间】:2018-06-23 00:19:28
【问题描述】:

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

例如,假设我有 20 家商店和 104 周。我想做一个以商店和周为列的小标题。生成的 tibble 应该是 2 列乘 20*104 行来表示所有商店周。

我的方法是

stores <- 1:20
weeks <- 1:104
cross2(stores,weeks) 

问题是我希望这是一个小标题而不是列表。我尝试用cross_df 替换cross,但没有成功。

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    如果你制作了一个命名列表,你可以将它传递给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_dfcross 的一个版本,之后简化为数据框,与 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。

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 2018-10-02
      • 2021-08-01
      • 2021-10-29
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多