如何对一组多列进行透视?以及如何从长格式恢复到原始宽格式?

Cri*_*an 3 r plyr dplyr

如果我有以下数据:

D = tibble::tribble(
  ~firm, ~ind, ~var1_1, ~var1_2, ~op2_1, ~op2_2,
  "A",     1,     10,     11,     11,     12,
  "A",     2,     12,     13,     13,     14,
  "B",     1,     14,     15,     15,     16,
  "B",     2,     16,     17,     17,     18,
  "C",     1,     18,     19,     19,     20,
  "C",     2,     20,     21,     21,     22,
)
Run Code Online (Sandbox Code Playgroud)

我怎样才能pivot_longer()var1 和 var2 有“_*”作为年份指示符?

我的意思是,我想要这样的东西:

D %>%
  pivot_longer(var1_1:op2_2,
  names_to = c(".value", "year"),
  names_pattern = "(.*)_(.*)",
  values_to = c("var1, var2")
  )
# A tibble: 12 x 5
   firm    ind year   var1  op2
   <chr> <dbl> <chr> <dbl> <dbl>
 1 A         1 1        10    11
 2 A         1 2        11    12
 3 A         2 1        12    13
 4 A         2 2        13    14
 5 B         1 1        14    15
 6 B         1 2        15    16
 7 B         2 1        16    17
 8 B         2 2        17    18
 9 C         1 1        18    19
10 C         1 2        19    20
11 C         2 1        20    21
12 C         2 2        21    22
Run Code Online (Sandbox Code Playgroud)

我使用上面的代码达到了预期的结果。然而,在我的真实案例中,我要处理 30 多个变量和 10 年。那么,使用起来values_to并不实用和干净。我希望代码将变量名称的第一部分读取为所需的新变量名称。由于最初所有要旋转的列的结构都类似于"varname_year"

此外,一旦我将新的数据格式转换为长格式,我可能需要返回宽格式以保留初始数据结构。

akr*_*run 7

我们可以使用其中之一select_helpers

library(dplyr)
library(tidyr)
library(stringr)
Dlong <- D %>%
          pivot_longer(cols = starts_with('var'), 
             names_to = c(".value", "year"), names_sep = "_")
Run Code Online (Sandbox Code Playgroud)

从“长”格式更改为“宽”格式pivot_wider

Dlong %>%
    pivot_wider(names_from = ind, values_from = str_c("var", 1:2))
Run Code Online (Sandbox Code Playgroud)