在 tidyverse 中重塑 table,pivot_wider 的问题

Reshape table in tidyverse, problems with pivot_wider

我有一个 table 看起来像:

library(tidyverse)

df_initial <- tibble::tribble(
        ~year_month, ~n_unique, ~new_n, ~old_n,
          "2021-01",       168,    159,      9,
          "2021-02",       249,    244,      5,
          "2021-03",       197,    186,     11
        )

又名:

# A tibble: 3 × 4
  year_month n_unique new_n old_n
  <chr>         <dbl> <dbl> <dbl>
1 2021-01         168   159     9
2 2021-02         249   244     5
3 2021-03         197   186    11

我想重塑列和行。 我尝试通过 pivot_wider 但我没有任何运气 - 特别是因为它没有找到正确的角色视图。

df_reshaped <- tibble::tribble(
                 ~year_month, ~`2021-01`, ~`2021-02`, ~`2021-03`,
                  "n_unique",      168,      249,      197,
                     "new_n",      159,      244,      186,
                     "old_n",        9,        5,       11
                 )

最后看起来像这样:

# A tibble: 3 × 4
  year_month `2021-01` `2021-02` `2021-03`
  <chr>          <dbl>     <dbl>     <dbl>
1 n_unique         168       249       197
2 new_n            159       244       186
3 old_n              9         5        11

我对如何使用该功能感到很困惑,如果您能提供帮助,我们将不胜感激!

交换行和列可以用转置函数存档:

t(df_initial)

这或多或少等同于通过交换列再次将所有内容旋转得更长和更宽:

df_initial %>%
  mutate(across(everything(), as.character)) %>% 
  pivot_longer(-year_month) %>%
  pivot_wider(names_from = year_month, values_from = value) %>%
  type_convert()


# A tibble: 3 × 4
  name     `2021-01` `2021-02` `2021-03`
  <chr>        <dbl>     <dbl>     <dbl>
1 n_unique       168       249       197
2 new_n          159       244       186
3 old_n            9         5        11

您可以使用一些 tibble 函数:

df_initial %>%
  column_to_rownames("year_month") %>%
  t() %>%
  as_tibble(rownames = "year_month")

# # A tibble: 3 x 4
#   year_month `2021-01` `2021-02` `2021-03`
#   <chr>          <dbl>     <dbl>     <dbl>
# 1 n_unique         168       249       197
# 2 new_n            159       244       186
# 3 old_n              9         5        11

它的base相当于:

setNames(data.frame(t(df_initial[-1])), df_initial[[1]])