【问题标题】:tidyr::pivot_wider() reorder column names grouping by `name_from`tidyr::pivot_wider() 重新排序按 `name_from` 分组的列名
【发布时间】:2020-06-09 11:19:17
【问题描述】:

我想重新排列按names_from 而不是values_from 分组的列,这是我的最小示例:

mtcars %>% 
tidyr::pivot_wider(names_from = gear, values_from = c(vs, am, carb)) 

输出:

    mpg   cyl  disp    hp  drat    wt  qsec  vs_4  vs_3  vs_5  am_4  am_3  am_5 carb_4 carb_3 carb_5
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
1  21       6   160   110  3.9   2.62  16.5     0    NA    NA     1    NA    NA      4     NA     NA
2  21       6   160   110  3.9   2.88  17.0     0    NA    NA     1    NA    NA      4     NA     NA
3  22.8     4   108    93  3.85  2.32  18.6     1    NA    NA     1    NA    NA      1     NA     NA

这是我想要的输出:

   mpg   cyl  disp    hp  drat    wt  qsec  vs_4  am_4 carb_4  vs_3  am_3 carb_3  vs_5  am_5 carb_5
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
1  21       6   160   110  3.9   2.62  16.5     0     1      4    NA    NA     NA    NA    NA     NA
2  21       6   160   110  3.9   2.88  17.0     0     1      4    NA    NA     NA    NA    NA     NA

提前致谢!

【问题讨论】:

  • 这已经是github上的一个未解决问题
  • 太棒了!感谢您关注@AnilGoyal

标签: r dataframe dplyr tidyr


【解决方案1】:

据我所知,这不能用pivot_wider 完成,必须在之后完成。

这是一个冗长的尝试,但它确实有效:

library(tidyverse)
suffixes <- unique(mtcars$gear)

pivoted <- mtcars %>%
  tidyr::pivot_wider(names_from = gear, values_from = c(vs, am, carb))

names_to_order <- map(suffixes, ~ names(pivoted)[grep(paste0("_", .x), names(pivoted))]) %>% unlist
names_id <- setdiff(names(pivoted), names_to_order)

pivoted %>%
  select(names_id, names_to_order)
#> # A tibble: 32 x 16
#>      mpg   cyl  disp    hp  drat    wt  qsec  vs_4  am_4 carb_4  vs_3  am_3
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>
#>  1  21       6  160    110  3.9   2.62  16.5     0     1      4    NA    NA
#>  2  21       6  160    110  3.9   2.88  17.0     0     1      4    NA    NA
#>  3  22.8     4  108     93  3.85  2.32  18.6     1     1      1    NA    NA
#>  4  21.4     6  258    110  3.08  3.22  19.4    NA    NA     NA     1     0
#>  5  18.7     8  360    175  3.15  3.44  17.0    NA    NA     NA     0     0
#>  6  18.1     6  225    105  2.76  3.46  20.2    NA    NA     NA     1     0
#>  7  14.3     8  360    245  3.21  3.57  15.8    NA    NA     NA     0     0
#>  8  24.4     4  147.    62  3.69  3.19  20       1     0      2    NA    NA
#>  9  22.8     4  141.    95  3.92  3.15  22.9     1     0      2    NA    NA
#> 10  19.2     6  168.   123  3.92  3.44  18.3     1     0      4    NA    NA
#> # ... with 22 more rows, and 4 more variables: carb_3 <dbl>, vs_5 <dbl>,
#> #   am_5 <dbl>, carb_5 <dbl>

reprex package (v0.3.0) 于 2020 年 2 月 25 日创建

【讨论】:

  • 这太棒了!太感谢了!我还注意到,如果列名包含_,我们可以在 tidyr::pivot_wider names_sep = "specialCharacter" 中应用此参数将“_”更改为另一个唯一字符,然后更新您的答案! ;)
  • 还值得注意的是,未在数据透视表中创建的其他列可能与grep 匹配(例如:如果有一列以“_3”结尾但不是枢轴)。在这种情况下,您可能希望使用names_prefix 并将调用更改为grep。如果我的回答令您满意,请考虑将其标记为已接受的答案。
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2020-06-18
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多