如果我有以下数据:
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
不太方便和干净。我希望代码能够读取变量名称的前一部分作为新变量名。因为最初要进行透视的所有列都是像“变量名称_年份”这样结构化的。
此外,一旦我将新的数据格式转换为长格式,可能需要返回宽格式以保持最初的数据结构。
matches
或仅使用数字索引。 - akrun