pivot_longer с группами столбцов - PullRequest
1 голос
/ 20 февраля 2020

У меня есть набор данных, который выглядит следующим образом:

df_start <- tribble(
    ~name,   ~age, ~x1_sn_ctrl1, ~x1_listing2_2, ~x1_affect1, ~x2_sn_ctrl1, ~x1_listing2_2, ~x2_affect1, ~number,
    "John",   28,        1,            1,             9,           4,            5,                9,       6,
    "Paul",   27,        2,            1,             4,           1,            3,                3,       4,
    "Ringo",  31,        3,            1,             2,           2,            5,                8,       9)

Мне нужно pivot_longer() при обработке группировок в моих столбцах:

  • Есть 2 x -values ​​(1 и 2)
  • Для каждого значения x есть 3 вопроса (sn_ctrl1, перечисление2_2 ,ffect1)

В моем фактическом наборе данных имеется 14 x.

По сути, я хотел бы применить pivot_longer() к значениям x, но оставить мои 3 вопроса (sn_ctrl1, перечисление2_2 ,ffect1) широкими.

В итоге я хотел бы вот что:

df_end <- tribble(
    ~name, ~age, ~xval, ~sn_ctrl1, ~listing2_2, ~affect1, ~number,
    "John", 28,    1,        1,         1,          9,       6,
    "John", 28,    2,        4,         5,          9,       6,
    "Paul", 27,    1,        2,         1,          4,       4,  
    "Paul", 27,    2,        1,         3,          3,       4, 
    "Ringo", 31,   1,        3,         1,          2,       9, 
    "Ringo", 31,   2,        2,         5,          8,       9)

Я пробовал лоты очень неудачных попыток играть с регулярным выражением в names_pattern & pivot_longer, но я полностью поражаю вне.

Кто-нибудь знает, как с этим справиться?

СПАСИБО!

PS: Обратите внимание, что я попытался сделать простой воспроизводимый пример. Фактические имена моих столбцов немного различаются. Например, есть x1_sn_ctrl1 & x1_attr1_ctrl2.

1 Ответ

5 голосов
/ 20 февраля 2020

Вы можете использовать:

tidyr::pivot_longer(df_start, 
                    cols = -c(name, age, number), 
                    names_to = c("xval", ".value"),
                    names_pattern = 'x(\\d+)_(q\\d+)')

# A tibble: 6 x 7
#  name    age number xval     q1    q2    q3
#  <chr> <dbl>  <dbl> <chr> <dbl> <dbl> <dbl>
#1 John     28      6 1         1     1     9
#2 John     28      6 2         4     5     9
#3 Paul     27      4 1         2     1     4
#4 Paul     27      4 2         1     3     3
#5 Ringo    31      9 1         3     1     2
#6 Ringo    31      9 2         2     5     8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...