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

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

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

问题

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

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

  1. library(tibble)
  2. #> 警告:package ‘tibble’ was built under R version 4.2.2
  3. library(tidyr)
  4. #> 警告:package ‘tidyr’ was built under R version 4.2.2
  5. #;; 这是有道理的,是符合期望的:
  6. #;; 将一个包含1行的表格与一个包含2行的表格交叉,我得到一个包含两行的表格。
  7. (df1 <- tibble(x=1))
  8. #> # A tibble: 1 × 1
  9. #> x
  10. #> <dbl>
  11. #> 1 1
  12. (df2 <- tibble(y=1:2))
  13. #> # A tibble: 2 × 1
  14. #> y
  15. #> <int>
  16. #> 1 1
  17. #> 2 2
  18. crossing(df1, df2)
  19. #> # A tibble: 2 × 2
  20. #> x y
  21. #> <dbl> <int>
  22. #> 1 1 1
  23. #> 2 1 2
  24. #;; 这是没有道理的。
  25. #;; 如果第二个包含2行的表格是数据框的列表,我仍然期望得到一个包含2行的表格,但我得到的是一个包含1行的表格。
  26. (df3 <- tibble(y=list(tibble(y=2), tibble(y=2))))
  27. #> # A tibble: 2 × 1
  28. #> y
  29. #> <list>
  30. #> 1 <tibble [1 × 1]>
  31. #> 2 <tibble [1 × 1]>
  32. crossing(df1, df3)
  33. #> # A tibble: 1 × 2
  34. #> x y
  35. #> <dbl> <list>
  36. #> 1 1 <tibble [1 × 1]>
  37. sessioninfo::session_info()
  38. #> ─ 会话信息 ─────────────────────────────────────────────────────────────
  39. #> 设置 值
  40. #> 版本 R version 4.2.1 Patched (2022-07-06 r82554 ucrt)
  41. #> 操作系统 Windows 10 x64 (build 19044)
  42. #> 系统 x86_64, mingw32
  43. #> 用户界面 RTerm
  44. #> 语言 (EN)
  45. #> 区域 English_United States.utf8
  46. #> 语言环境 English_United States.utf8
  47. #> 时区 America/Chicago
  48. #> 日期 2023-02-26
  49. #> pandoc 2.19.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
  50. #>
  51. #> ─ 包 ───────────────────────────────────────────────────────────────────
  52. #> 包 * 版本 日期 (UTC) 基础R来源
  53. #> cli 3.6.0 2023-01-09 [1] CRAN (R 4.2.2)
  54. #> digest 0.6.31 2022-12-11 [1] CRAN (R 4.2.2)
  55. #> dplyr 1.1.0 2023-01-29 [1] CRAN (R 4.2.2)
  56. #> evaluate 0.20 2023-01-17 [1] CRAN (R 4.2.2)
  57. #> fansi 1.0.4 2023-01-22 [1] CRAN (R 4.2.2)
  58. #> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.2.1)
  59. #> fs 1.6.1 2023-02-06 [1] CRAN (R 4.2.2)
  60. #> generics 0.1.3 2022-07-05 [1] CRAN (R 4.2.1)
  61. #> glue 1.6.2 2022-02-24 [1] CRAN (R 4.2.1)
  62. #> htmltools 0.5.4 2022-12-07 [1] CRAN (R 4.2.2)
  63. #> knitr 1.42 2023-01-25 [1] CRAN (R 4.2.2)
  64. #> lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.2.1)
  65. #> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.2.1)
  66. #> pillar 1.8.1 2022-08-19 [1] CRAN (R 4.2.1)
  67. #> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.2.1
  68. <details>
  69. <summary>英文:</summary>
  70. 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.
  71. Cross-posted as a bug on github: https://github.com/tidyverse/tidyr/issues/1487
  72. ``` r
  73. library(tibble)
  74. #&gt; Warning: package &#39;tibble&#39; was built under R version 4.2.2
  75. library(tidyr)
  76. #&gt; Warning: package &#39;tidyr&#39; was built under R version 4.2.2
  77. #;; This makes sense, is expected:
  78. #;; Crossing a 1-row table with a 2-row table, I get a two row table.
  79. (df1 &lt;- tibble(x=1))
  80. #&gt; # A tibble: 1 &#215; 1
  81. #&gt; x
  82. #&gt; &lt;dbl&gt;
  83. #&gt; 1 1
  84. (df2 &lt;- tibble(y=1:2))
  85. #&gt; # A tibble: 2 &#215; 1
  86. #&gt; y
  87. #&gt; &lt;int&gt;
  88. #&gt; 1 1
  89. #&gt; 2 2
  90. crossing(df1, df2)
  91. #&gt; # A tibble: 2 &#215; 2
  92. #&gt; x y
  93. #&gt; &lt;dbl&gt; &lt;int&gt;
  94. #&gt; 1 1 1
  95. #&gt; 2 1 2
  96. #;; This does not make sense.
  97. #;; If the second 2-row table is a list of dataframes, I still expect a 2-row
  98. #;; table, but I get a 1-row table.
  99. (df3 &lt;- tibble(y=list(tibble(y=2), tibble(y=2))))
  100. #&gt; # A tibble: 2 &#215; 1
  101. #&gt; y
  102. #&gt; &lt;list&gt;
  103. #&gt; 1 &lt;tibble [1 &#215; 1]&gt;
  104. #&gt; 2 &lt;tibble [1 &#215; 1]&gt;
  105. crossing(df1, df3)
  106. #&gt; # A tibble: 1 &#215; 2
  107. #&gt; x y
  108. #&gt; &lt;dbl&gt; &lt;list&gt;
  109. #&gt; 1 1 &lt;tibble [1 &#215; 1]&gt;
  110. sessioninfo::session_info()
  111. #&gt; ─ Session info ───────────────────────────────────────────────────────────────
  112. #&gt; setting value
  113. #&gt; version R version 4.2.1 Patched (2022-07-06 r82554 ucrt)
  114. #&gt; os Windows 10 x64 (build 19044)
  115. #&gt; system x86_64, mingw32
  116. #&gt; ui RTerm
  117. #&gt; language (EN)
  118. #&gt; collate English_United States.utf8
  119. #&gt; ctype English_United States.utf8
  120. #&gt; tz America/Chicago
  121. #&gt; date 2023-02-26
  122. #&gt; pandoc 2.19.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
  123. #&gt;
  124. #&gt; ─ Packages ───────────────────────────────────────────────────────────────────
  125. #&gt; package * version date (UTC) lib source
  126. #&gt; cli 3.6.0 2023-01-09 [1] CRAN (R 4.2.2)
  127. #&gt; digest 0.6.31 2022-12-11 [1] CRAN (R 4.2.2)
  128. #&gt; dplyr 1.1.0 2023-01-29 [1] CRAN (R 4.2.2)
  129. #&gt; evaluate 0.20 2023-01-17 [1] CRAN (R 4.2.2)
  130. #&gt; fansi 1.0.4 2023-01-22 [1] CRAN (R 4.2.2)
  131. #&gt; fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.2.1)
  132. #&gt; fs 1.6.1 2023-02-06 [1] CRAN (R 4.2.2)
  133. #&gt; generics 0.1.3 2022-07-05 [1] CRAN (R 4.2.1)
  134. #&gt; glue 1.6.2 2022-02-24 [1] CRAN (R 4.2.1)
  135. #&gt; htmltools 0.5.4 2022-12-07 [1] CRAN (R 4.2.2)
  136. #&gt; knitr 1.42 2023-01-25 [1] CRAN (R 4.2.2)
  137. #&gt; lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.2.1)
  138. #&gt; magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.2.1)
  139. #&gt; pillar 1.8.1 2022-08-19 [1] CRAN (R 4.2.1)
  140. #&gt; pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.2.1)
  141. #&gt; purrr 1.0.1 2023-01-10 [1] CRAN (R 4.2.2)
  142. #&gt; R.cache 0.16.0 2022-07-21 [1] CRAN (R 4.2.2)
  143. #&gt; R.methodsS3 1.8.2 2022-06-13 [1] CRAN (R 4.2.2)
  144. #&gt; R.oo 1.25.0 2022-06-12 [1] CRAN (R 4.2.2)
  145. #&gt; R.utils 2.12.2 2022-11-11 [1] CRAN (R 4.2.2)
  146. #&gt; R6 2.5.1 2021-08-19 [1] CRAN (R 4.2.1)
  147. #&gt; reprex 2.0.2 2022-08-17 [1] CRAN (R 4.2.2)
  148. #&gt; rlang 1.0.6 2022-09-24 [1] CRAN (R 4.2.1)
  149. #&gt; rmarkdown 2.20 2023-01-19 [1] CRAN (R 4.2.2)
  150. #&gt; rstudioapi 0.14 2022-08-22 [1] CRAN (R 4.2.2)
  151. #&gt; sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.2.1)
  152. #&gt; styler 1.9.0 2023-01-15 [1] CRAN (R 4.2.2)
  153. #&gt; tibble * 3.1.8 2022-07-22 [1] CRAN (R 4.2.2)
  154. #&gt; tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.2.2)
  155. #&gt; tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.2.1)
  156. #&gt; utf8 1.2.3 2023-01-31 [1] CRAN (R 4.2.2)
  157. #&gt; vctrs 0.5.2 2023-01-23 [1] CRAN (R 4.2.2)
  158. #&gt; withr 2.5.0 2022-03-03 [1] CRAN (R 4.2.1)
  159. #&gt; xfun 0.37 2023-01-31 [1] CRAN (R 4.2.2)
  160. #&gt; yaml 2.3.7 2023-01-23 [1] CRAN (R 4.2.2)
  161. #&gt;
  162. #&gt; [1] C:/Users/irinzn/R/R-4.2.1patched/library
  163. #&gt;
  164. #&gt; ──────────────────────────────────────────────────────────────────────────────

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

答案1

得分: 1

查看 ?crossing

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

请使用 expand_grid 代替

  1. expand_grid(df1, df3)
  2. # 一个数据表:2 行 × 2 列
  3. x y
  4. <dbl> <list>
  5. 1 1 <tibble [1 × 1]>
  6. 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

  1. expand_grid(df1, df3)
  2. # A tibble: 2 &#215; 2
  3. x y
  4. &lt;dbl&gt; &lt;list&gt;
  5. 1 1 &lt;tibble [1 &#215; 1]&gt;
  6. 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:

确定