`tidyr::crossing()` 使用一个数据框列表意外地减少了行数。

huangapple go评论60阅读模式
英文:

`tidyr::crossing()` with a list of tibbles unexpectedly reduces rows

问题

以下是我困惑的示例。当我将一个包含1行的表格与一个包含2行的表格相交叉时,我期望得到一个包含2行的表格。这对于原子列类型有效。但是,如果2行表格是数据框的列表,我得到的不是期望的2行表格,而是一个包含1行的表格。这对我来说是没有道理的。有人能解释为什么我应该期望这样,或者是否有什么我遗漏的东西。

作为错误的交叉发布在 GitHub 上:https://github.com/tidyverse/tidyr/issues/1487

library(tibble)
#> 警告:package ‘tibble’ was built under R version 4.2.2
library(tidyr)
#> 警告:package ‘tidyr’ was built under R version 4.2.2

#;; 这是有道理的,是符合期望的:
#;; 将一个包含1行的表格与一个包含2行的表格交叉,我得到一个包含两行的表格。
(df1 <- tibble(x=1))
#> # A tibble: 1 × 1
#>       x
#>   <dbl>
#> 1     1
(df2 <- tibble(y=1:2))
#> # A tibble: 2 × 1
#>       y
#>   <int>
#> 1     1
#> 2     2
crossing(df1, df2)
#> # A tibble: 2 × 2
#>       x     y
#>   <dbl> <int>
#> 1     1     1
#> 2     1     2

#;; 这是没有道理的。
#;; 如果第二个包含2行的表格是数据框的列表,我仍然期望得到一个包含2行的表格,但我得到的是一个包含1行的表格。
(df3 <- tibble(y=list(tibble(y=2), tibble(y=2))))
#> # A tibble: 2 × 1
#>   y               
#>   <list>          
#> 1 <tibble [1 × 1]>
#> 2 <tibble [1 × 1]>
crossing(df1, df3)
#> # A tibble: 1 × 2
#>       x y               
#>   <dbl> <list>          
#> 1     1 <tibble [1 × 1]>

sessioninfo::session_info()
#> ─ 会话信息 ─────────────────────────────────────────────────────────────
#>  设置   值
#>  版本   R version 4.2.1 Patched (2022-07-06 r82554 ucrt)
#>  操作系统   Windows 10 x64 (build 19044)
#>  系统   x86_64, mingw32
#>  用户界面   RTerm
#>  语言   (EN)
#>  区域   English_United States.utf8
#>  语言环境   English_United States.utf8
#>  时区   America/Chicago
#>  日期   2023-02-26
#>  pandoc   2.19.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ 包 ───────────────────────────────────────────────────────────────────
#>  包     * 版本     日期 (UTC)  基础R来源
#>  cli       3.6.0   2023-01-09 [1] CRAN (R 4.2.2)
#>  digest    0.6.31  2022-12-11 [1] CRAN (R 4.2.2)
#>  dplyr     1.1.0   2023-01-29 [1] CRAN (R 4.2.2)
#>  evaluate  0.20    2023-01-17 [1] CRAN (R 4.2.2)
#>  fansi     1.0.4   2023-01-22 [1] CRAN (R 4.2.2)
#>  fastmap   1.1.0   2021-01-25 [1] CRAN (R 4.2.1)
#>  fs        1.6.1   2023-02-06 [1] CRAN (R 4.2.2)
#>  generics  0.1.3   2022-07-05 [1] CRAN (R 4.2.1)
#>  glue      1.6.2   2022-02-24 [1] CRAN (R 4.2.1)
#>  htmltools 0.5.4   2022-12-07 [1] CRAN (R 4.2.2)
#>  knitr     1.42    2023-01-25 [1] CRAN (R 4.2.2)
#>  lifecycle 1.0.3   2022-10-07 [1] CRAN (R 4.2.1)
#>  magrittr  2.0.3   2022-03-30 [1] CRAN (R 4.2.1)
#>  pillar    1.8.1   2022-08-19 [1] CRAN (R 4.2.1)
#>  pkgconfig 2.0.3   2019-09-22 [1] CRAN (R 4.2.1

<details>
<summary>英文:</summary>

Below is a reprex of my confusion.  I expect when I cross a 1-row tibble with a 2-row tibble, I get a 2-row tibble.  This does work with atomic column types.  However, if the 2-row tibble is a list of dataframes, I don&#39;t get a 2-row table, like expected, but a 1-row table.  This does not make sense to me.  Can someone explain why it is what I should expect, or if there is something I&#39;m missing.

Cross-posted as a bug on github: https://github.com/tidyverse/tidyr/issues/1487

``` r
library(tibble)
#&gt; Warning: package &#39;tibble&#39; was built under R version 4.2.2
library(tidyr)
#&gt; Warning: package &#39;tidyr&#39; was built under R version 4.2.2

#;; This makes sense, is expected:
#;; Crossing a 1-row table with a 2-row table, I get a two row table.
(df1 &lt;- tibble(x=1))
#&gt; # A tibble: 1 &#215; 1
#&gt;       x
#&gt;   &lt;dbl&gt;
#&gt; 1     1
(df2 &lt;- tibble(y=1:2))
#&gt; # A tibble: 2 &#215; 1
#&gt;       y
#&gt;   &lt;int&gt;
#&gt; 1     1
#&gt; 2     2
crossing(df1, df2)
#&gt; # A tibble: 2 &#215; 2
#&gt;       x     y
#&gt;   &lt;dbl&gt; &lt;int&gt;
#&gt; 1     1     1
#&gt; 2     1     2

#;; This does not make sense.
#;; If the second 2-row table is a list of dataframes, I still expect a 2-row
#;; table, but I get a 1-row table.
(df3 &lt;- tibble(y=list(tibble(y=2), tibble(y=2))))
#&gt; # A tibble: 2 &#215; 1
#&gt;   y               
#&gt;   &lt;list&gt;          
#&gt; 1 &lt;tibble [1 &#215; 1]&gt;
#&gt; 2 &lt;tibble [1 &#215; 1]&gt;
crossing(df1, df3)
#&gt; # A tibble: 1 &#215; 2
#&gt;       x y               
#&gt;   &lt;dbl&gt; &lt;list&gt;          
#&gt; 1     1 &lt;tibble [1 &#215; 1]&gt;

sessioninfo::session_info()
#&gt; ─ Session info ───────────────────────────────────────────────────────────────
#&gt;  setting  value
#&gt;  version  R version 4.2.1 Patched (2022-07-06 r82554 ucrt)
#&gt;  os       Windows 10 x64 (build 19044)
#&gt;  system   x86_64, mingw32
#&gt;  ui       RTerm
#&gt;  language (EN)
#&gt;  collate  English_United States.utf8
#&gt;  ctype    English_United States.utf8
#&gt;  tz       America/Chicago
#&gt;  date     2023-02-26
#&gt;  pandoc   2.19.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
#&gt; 
#&gt; ─ Packages ───────────────────────────────────────────────────────────────────
#&gt;  package     * version date (UTC) lib source
#&gt;  cli           3.6.0   2023-01-09 [1] CRAN (R 4.2.2)
#&gt;  digest        0.6.31  2022-12-11 [1] CRAN (R 4.2.2)
#&gt;  dplyr         1.1.0   2023-01-29 [1] CRAN (R 4.2.2)
#&gt;  evaluate      0.20    2023-01-17 [1] CRAN (R 4.2.2)
#&gt;  fansi         1.0.4   2023-01-22 [1] CRAN (R 4.2.2)
#&gt;  fastmap       1.1.0   2021-01-25 [1] CRAN (R 4.2.1)
#&gt;  fs            1.6.1   2023-02-06 [1] CRAN (R 4.2.2)
#&gt;  generics      0.1.3   2022-07-05 [1] CRAN (R 4.2.1)
#&gt;  glue          1.6.2   2022-02-24 [1] CRAN (R 4.2.1)
#&gt;  htmltools     0.5.4   2022-12-07 [1] CRAN (R 4.2.2)
#&gt;  knitr         1.42    2023-01-25 [1] CRAN (R 4.2.2)
#&gt;  lifecycle     1.0.3   2022-10-07 [1] CRAN (R 4.2.1)
#&gt;  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.2.1)
#&gt;  pillar        1.8.1   2022-08-19 [1] CRAN (R 4.2.1)
#&gt;  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.2.1)
#&gt;  purrr         1.0.1   2023-01-10 [1] CRAN (R 4.2.2)
#&gt;  R.cache       0.16.0  2022-07-21 [1] CRAN (R 4.2.2)
#&gt;  R.methodsS3   1.8.2   2022-06-13 [1] CRAN (R 4.2.2)
#&gt;  R.oo          1.25.0  2022-06-12 [1] CRAN (R 4.2.2)
#&gt;  R.utils       2.12.2  2022-11-11 [1] CRAN (R 4.2.2)
#&gt;  R6            2.5.1   2021-08-19 [1] CRAN (R 4.2.1)
#&gt;  reprex        2.0.2   2022-08-17 [1] CRAN (R 4.2.2)
#&gt;  rlang         1.0.6   2022-09-24 [1] CRAN (R 4.2.1)
#&gt;  rmarkdown     2.20    2023-01-19 [1] CRAN (R 4.2.2)
#&gt;  rstudioapi    0.14    2022-08-22 [1] CRAN (R 4.2.2)
#&gt;  sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.2.1)
#&gt;  styler        1.9.0   2023-01-15 [1] CRAN (R 4.2.2)
#&gt;  tibble      * 3.1.8   2022-07-22 [1] CRAN (R 4.2.2)
#&gt;  tidyr       * 1.3.0   2023-01-24 [1] CRAN (R 4.2.2)
#&gt;  tidyselect    1.2.0   2022-10-10 [1] CRAN (R 4.2.1)
#&gt;  utf8          1.2.3   2023-01-31 [1] CRAN (R 4.2.2)
#&gt;  vctrs         0.5.2   2023-01-23 [1] CRAN (R 4.2.2)
#&gt;  withr         2.5.0   2022-03-03 [1] CRAN (R 4.2.1)
#&gt;  xfun          0.37    2023-01-31 [1] CRAN (R 4.2.2)
#&gt;  yaml          2.3.7   2023-01-23 [1] CRAN (R 4.2.2)
#&gt; 
#&gt;  [1] C:/Users/irinzn/R/R-4.2.1patched/library
#&gt; 
#&gt; ──────────────────────────────────────────────────────────────────────────────

<sup>Created on 2023-02-26 with reprex v2.0.2</sup>

答案1

得分: 1

查看 ?crossing

> ‘crossing()是对expand_grid()` 的封装,用于去重和排序其输入

请使用 expand_grid 代替

expand_grid(df1, df3)
# 一个数据表:2 行 × 2 列
      x y
  <dbl> <list>
1     1 <tibble [1 × 1]>
2     1 <tibble [1 × 1]>
英文:

See ?crossing

>‘crossing()’ is a wrapper around ‘expand_grid()’ that
de-duplicates and sorts its inputs

Use expand_grid instead

expand_grid(df1, df3)
# A tibble: 2 &#215; 2
x y               
&lt;dbl&gt; &lt;list&gt;          
1     1 &lt;tibble [1 &#215; 1]&gt;
2     1 &lt;tibble [1 &#215; 1]&gt;

huangapple
  • 本文由 发表于 2023年2月27日 01:18:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/75573731.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定