如果我有以下数据:
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"。
此外,一旦我将新的数据格式转换为长格式,我可能需要返回宽格式以保留初始数据结构。
我们可以使用其中之一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)