首页 > 解决方案 > 冗余基因列表简化

问题描述

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

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(第一个列)相关的所有可能值,由制表符分隔(因此最多将填充 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 的一些迹象。

标签: r

解决方案


这是使用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)

这可以用制表符分隔写出到文件中,并作为制表符分隔文件读回。


推荐阅读