2016-09-20 80 views
0

我需要根據組值更改表格的格式,但保留整個行值。這裏是原來的表將表格更改爲基於組的更長格式

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 

因此,最初的組值在每列的規定,但現在應該各行中指定。任何想法如何做到這一點? 謝謝

回答

0

以下答案假設您要轉換的列名爲"Val[A-Z]+[0-9]+";即「Val」後跟任意數量的大寫字母,然後是任意數字。在這種情況下,導致包含採集到的列名Key

  1. 首先gather列。
  2. mutateKey列使用字符串替換形成兩列:GrGnum。將創建Gnum列以匹配結果的列名稱(即Gr_Val1Gr_Val2等)。
  3. 然後,group_byGrspread使用Gnum作爲關鍵字和收集值作爲值。

使用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 
+0

謝謝!工作,並解決了這個問題! – Barbara