首页 > 解决方案 > 在不同键下的 R 中的多重聚集

问题描述

我有一个如下数据集:

 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

尝试了一些搜索,但似乎找不到可能使用多重收集的解决方案。感谢任何见解。

标签: rtidyversetidyr

解决方案


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

推荐阅读