Multi-собирать в R под разными ключами - PullRequest
0 голосов
/ 03 октября 2019

У меня есть набор данных, подобный следующему:

 id v1a v2a v3a v1b v2b v3b v1c v2c v3c
  1  10  11  12  20  21  22  30  31  32
  2  11  12  13  21  22  23  31  32  33
  3  15  16  17  25  26  27  35  36  37

Я знаю, что могу довольно легко использовать сбор для одного набора столбцов, например

  gather(df,index,Avar,v1a:v2a,factor_key=TRUE)

, который превратит мои данные в

 id index Avar v1b v2b v3b v1c v2c v3c
  1   v1a  10   20  21  22  30  31  32
  1   v2a  11   20  21  22  30  31  32
  1   v3a  12   20  21  22  30  31  32
  2   v1a  11   21  22  23  31  32  33
  2   v2a  12   21  22  23  31  32  33
  2   v3a  13   21  22  23  31  32  33
  ...

Я хотел бы создать три индекса с соответствующими собранными столбцами, используя tidyverse так, чтобы структура выглядела как

  id index1 Avar index2 Bvar index3 Cvar
  1   v1a  10    v1b   20   v1c   30
  1   v1b  11    v2b   21   v2c   31
  1   v1c  12    v3b   22   v3c   32
  2   v1a  11    v1b   21   v1c   31
  2   v1b  12    v2b   22   v2c   32 
  2   v1c  13    v3b   23   v3c   33
  ...

. До сих пор я пытался подгруппировать операторы сбора, такие как

  df1=gather(df,index1,Avar,v1a:v2a,factor_key=TRUE) %>%
      gather(df,index2,Bvar,v1b:v2b,factor_key=TRUE) %>%
      gather(df,index3,Cvar,v1c:v2c,factor_key=TRUE)

, но это не сработает, прежде чем я начну, так как я получаю сообщение об ошибке

  Error in .f(.x[[i]],...) : object 'index2' not found

Попытался выполнить поиск, но не могу найти решение, которое могло бы использовать множественный сбор. Благодарен за любые идеи.

1 Ответ

1 голос
/ 03 октября 2019
library(tidyr) #tidyr 1.0.0'
#(v\\d)(\\D) means v and one digit in one group and a none digit in the 2nd group
pivot_longer(df, cols=v1a:v3c, names_to = c('index','.value'), names_pattern = "(v\\d)(\\D)")

# A tibble: 9 x 5
     id index     a     b     c
  <int> <chr> <int> <int> <int>
1     1 v1       10    20    30
2     1 v2       11    21    31
3     1 v3       12    22    32
4     2 v1       11    21    31
5     2 v2       12    22    32
6     2 v3       13    23    33
7     3 v1       15    25    35
8     3 v2       16    26    36
9     3 v3       17    27    37
...