根据组将表更改为更长的格式

时间:2016-09-20 17:06:07

标签: r

我需要根据组值更改表的格式,但保留整个行值。以下是原始表的示例

Row  Atr1  Atr2 Atr3 ValA1   ValA2  ValA3  ValB1  ValB2 ValB3 ValC1 ValC2 ValC3
       1  21   SNV  T    yes     yes    100    yes    yes    98.1  no    yes    100
       2  43   SNp  C    yes     no     0      yes    no     0.65  yes   no       0
       3  43   SNV  C    yes     yes    100    yes    yes    99.35 yes   yes    100
       4  47   SNp  C    yes     yes    8.97   yes    no     0     yes   no       0

我需要将其改为

Row Atr1 Atr2 Atr3 Gr    Gr_Val1 Gr_Val2 Gr_Val3
   1  21 SNV  T    A       yes    yes        100
   2  21 SNV  T    B       yes    yes       98.1
   3  21 SNV  T    C       no     yes        100
   4  43 SNp  C    A       yes    no           0
   5  43 SNp  C    B       yes    no        0.65
   6  43 SNp  C    C       yes    no           0
   7  43 SNV  C    A       yes    yes        100
   8  43 SNV  C    B       yes    yes      99.35
   9  43 SNV  C    C       yes    yes        100
  10  47 SNp  C    A       yes    yes       8.97
  11  47 SNp  C    B       yes    no           0
  12  47 SNp  C    C       yes    no           0

因此,在每列中指定了初始组值,但现在应在每一行中指定。关于如何做到这一点的任何想法? 谢谢

1 个答案:

答案 0 :(得分:0)

以下答案假定您要转换的列名为"Val[A-Z]+[0-9]+";那是" Val"跟随任意数量的大写字母,然后跟随任意数量的数字。在那种情况下,

  1. 首先gather列生成Key列,其中包含收集的列名称。
  2. mutateKey列使用字符串替换形成两列:GrGnum。将创建Gnum列以匹配结果的列名称(即Gr_Val1Gr_Val2等。)。
  3. 然后,group_by Grspread使用Gnum作为关键字,将收集的值作为值。
  4. 使用dplyr

    library(dplyr) 
    result <- df %>% gather("Key","Vals",-c(Row:Atr3)) %>% 
                     mutate(Gr=sub("[0-9]+","",sub("Val","",Key)),
                            Gnum=paste0("Gr_",sub("Val[A-Z]+","Val",Key))) %>% 
                     select(-Key) %>% 
                     group_by(Gr) %>% 
                     spread(Gnum,Vals)
    

    result符合预期:

    print(result)
    ##Source: local data frame [12 x 8]
    ##Groups: Gr [3]
    ##
    ##     Row  Atr1   Atr2   Atr3    Gr Gr_Val1 Gr_Val2 Gr_Val3
    ##*  <int> <int> <fctr> <fctr> <chr>   <chr>   <chr>   <chr>
    ##1      1    21    SNV      T     A     yes     yes     100
    ##2      1    21    SNV      T     B     yes     yes    98.1
    ##3      1    21    SNV      T     C      no     yes     100
    ##4      2    43    SNp      C     A     yes      no       0
    ##5      2    43    SNp      C     B     yes      no    0.65
    ##6      2    43    SNp      C     C     yes      no       0
    ##7      3    43    SNV      C     A     yes     yes     100
    ##8      3    43    SNV      C     B     yes     yes   99.35
    ##9      3    43    SNV      C     C     yes     yes     100
    ##10     4    47    SNp      C     A     yes     yes    8.97
    ##11     4    47    SNp      C     B     yes      no       0
    ##12     4    47    SNp      C     C     yes      no       0