Как pivot_longer набор из нескольких столбцов? и как go вернуться из этого длинного формата в оригинальную? - PullRequest
1 голос
/ 17 января 2020

Если у меня есть следующие данные:

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 не практично и не чисто. Я бы хотел, чтобы код прочитал первую часть имени переменной как желаемое имя новой переменной. Поскольку изначально все столбцы, подлежащие повороту, структурированы как "varname_year" .

Кроме того, как только я получу новый формат данных в long, мне может понадобиться go вернуться к Широкоформатное хранение исходной структуры данных.

1 Ответ

1 голос
/ 17 января 2020

Мы можем использовать один из 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))
...