冗余基因列表简化

时间:2018-05-02 14:02:45

标签: r

我需要转换此格式,基本上你有1个基因ID(第一个col),最多5个可能的值在第3列中关联:

TMCS09g1008676  fleshy  0.000234939
TMCS09g1008676  fleshy  1.38379E-05
TMCS09g1008676  fleshy  0.00331883
TMCS09g1008677  fleshy  0.0481578
TMCS09g1008678  fleshy  0.0350491
TMCS09g1008679  fleshy  0.0335639
TMCS09g1008680  fleshy  0.0167087
TMCS09g1008681  fleshy  0.00301089
TMCS09g1008682  fleshy  0.00519838
TMCS09g1008682  fleshy  0.0399833
TMCS09g1008682  fleshy  0.0122184
TMCS09g1008683  fleshy  0.00202427
TMCS09g1008683  fleshy  0.00199513
TMCS09g1008683  fleshy  0.0350491
TMCS09g1008683  fleshy  0.00331883
TMCS09g1008683  fleshy  0.0399833

这里你有与每个基因ID(第一个col)相关联的所有可能值,用tab分隔(因此最多可填充5个字段):

TMCS09g1008676  0.000234939 1.38379E-05 0.00331883      
TMCS09g1008677  0.0481578               
TMCS09g1008678  0.0350491               
TMCS09g1008679  0.0335639               
TMCS09g1008680  0.0167087               
TMCS09g1008681  0.00301089              
TMCS09g1008682  0.00519838  0.0399833   0.0122184       
TMCS09g1008683  0.00202427  0.00199513  0.0350491   0.00331883  0.0399833

我非常感谢R的一些迹象。

1 个答案:

答案 0 :(得分:1)

以下是使用dplyr包的一种解决方案。您可以根据您未提供的列名调整代码。

library(dplyr)

df <- read.table(text = "TMCS09g1008676  fleshy  0.000234939
    TMCS09g1008676  fleshy  1.38379E-05
    TMCS09g1008676  fleshy  0.00331883
    TMCS09g1008677  fleshy  0.0481578
    TMCS09g1008678  fleshy  0.0350491
    TMCS09g1008679  fleshy  0.0335639
    TMCS09g1008680  fleshy  0.0167087
    TMCS09g1008681  fleshy  0.00301089
    TMCS09g1008682  fleshy  0.00519838
    TMCS09g1008682  fleshy  0.0399833
    TMCS09g1008682  fleshy  0.0122184
    TMCS09g1008683  fleshy  0.00202427
    TMCS09g1008683  fleshy  0.00199513
    TMCS09g1008683  fleshy  0.0350491
    TMCS09g1008683  fleshy  0.00331883
    TMCS09g1008683  fleshy  0.0399833")

df %>% group_by(V1) %>% slice(1:5) %>% summarise(V3 = paste(V3, collapse = ' '))

# A tibble: 8 x 2
  V1             V3                                                  
  <fctr>         <chr>                                               
1 TMCS09g1008676 0.000234939 1.38379e-05 0.00331883                  
2 TMCS09g1008677 0.0481578                                           
3 TMCS09g1008678 0.0350491                                           
4 TMCS09g1008679 0.0335639                                           
5 TMCS09g1008680 0.0167087                                           
6 TMCS09g1008681 0.00301089                                          
7 TMCS09g1008682 0.00519838 0.0399833 0.0122184                      
8 TMCS09g1008683 0.00202427 0.00199513 0.0350491 0.00331883 0.0399833

在上文中,slice将每组的值限制为5。

编辑:似乎所需的输出是五个值中每个值的多列。这是一个解决方案:

library(tidyr)
library(dplyr)

df %>% select(-V2) %>% group_by(V1) %>% slice(1:5) %>% mutate(valueId = paste0('value', row_number())) %>% spread(valueId, V3)

这可以写入带有制表符分隔符的文件,并作为制表符分隔文件回读。