如何将多列数据转换为长格式?如何从长格式恢复回原始宽格式?

3

如果我有以下数据:

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,
)

如何使用 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

使用上述代码我已经达到了预期的结果。但是在我的实际情况中,我处理超过30个变量和10年的数据。因此,使用 values_to 不太方便和干净。我希望代码能够读取变量名称的前一部分作为新变量名。因为最初要进行透视的所有列都是像“变量名称_年份”这样结构化的。

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

1个回答

7
我们可以使用其中一个select_helpers
library(dplyr)
library(tidyr)
library(stringr)
Dlong <- D %>%
          pivot_longer(cols = starts_with('var'), 
             names_to = c(".value", "year"), names_sep = "_")

从“长格式”转换为“宽格式”使用pivot_wider函数。
Dlong %>%
    pivot_wider(names_from = ind, values_from = str_c("var", 1:2))

如果所有列都以不同的名称开头,该怎么办? - Cristhian
1
@Cristhian 有很多选择,可以使用matches或仅使用数字索引。 - akrun
1
点赞因为你很棒。 - Anoushiravan R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接