Как я могу искать и уплотнять повторяющиеся строки во фрейме данных в R? - PullRequest
0 голосов
/ 09 мая 2020

Я использую R для обработки данных секвенирования РНК, в которых я новичок. Я использую рамки данных справочного материала от BioMart, которые, когда включены GO терминов, очень плохо организованы (как показано ниже).

head(goZref)
      Gene.stable.ID Transcript.stable.ID  Protein.stable.ID
1 ENSDARG00000063344   ENSDART00000131829 ENSDARP00000123357
2 ENSDARG00000063344   ENSDART00000131829 ENSDARP00000123357
3 ENSDARG00000063344   ENSDART00000144883 ENSDARP00000114467
4 ENSDARG00000063344   ENSDART00000144883 ENSDARP00000114467
5 ENSDARG00000097685   ENSDART00000156963 ENSDARP00000128236
6 ENSDARG00000097685   ENSDART00000156963 ENSDARP00000128236
                                                            Gene.description         Gene.name WikiGene.name
1 family with sequence similarity 162 member A [Source:NCBI gene;Acc:336363]           fam162a       fam162a
2 family with sequence similarity 162 member A [Source:NCBI gene;Acc:336363]           fam162a       fam162a
3 family with sequence similarity 162 member A [Source:NCBI gene;Acc:336363]           fam162a       fam162a
4 family with sequence similarity 162 member A [Source:NCBI gene;Acc:336363]           fam162a       fam162a
5                      si:ch211-235i11.3 [Source:ZFIN;Acc:ZDB-GENE-131125-9] si:ch211-235i11.3  LOC101885363
6                      si:ch211-235i11.3 [Source:ZFIN;Acc:ZDB-GENE-131125-9] si:ch211-235i11.3  LOC101885363
                                                       GO.term.name
1                                                          membrane
2                                    integral component of membrane
3                                                          membrane
4                                    integral component of membrane
5                                              nucleic acid binding
6 RNA polymerase II regulatory region sequence-specific DNA binding

Я хочу аннотировать набор данных интересующих генов (имена генов находятся в векторе символов, называемом здесь genes), но я изо всех сил пытаюсь автоматизировать его, учитывая все повторения и дублирование строк в ссылках. Я пробовал использовать match, но поскольку он находит только первый экземпляр чего-то, что я пропускаю в других строках. Я хотел бы, например, найти «fam162a» и получить что-то вроде «мембрана, неотъемлемый компонент мембраны», а затем автоматизировать это для списка из 100 имен генов. subset полезен для предоставления мне нескольких строк с одним и тем же идентификатором имени гена, и я пытался передать его на ddply, но я действительно не знаю, что делаю, и застрял здесь:

test<- ddply(.data = goZref, .variables = genes, for (x in genes) {
+ paste(unique(subset(goZref, WikiGene.name==x, select= Go.term.name)), sep = ",")})
Error in parse(text = x) : <text>:1:12: unexpected symbol
1: si:dkey-224k5.13
               ^

Edit: Мой желаемый результат был бы чем-то вроде матрицы моих входных 100 имен генов и соответствующей информации из всех соответствующих строк в столбце Go .description, например, если fam162a и LOC101885363, если бы в списке были гены, результат был бы следующим:

1 fam162a       membrane,integral component of membrane
2 LOC101885363  nucleic acid binding,RNA polymerase II regulatory region... 

Любая помощь с благодарностью приветствуется!

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

Вот решение dplyr:

ДАННЫЕ:

df <- data.frame(Gene.name = c("fam162a", "fam162a", "fam162a", "fam162a", "LOC101885363", "LOC101885363"),
                 Gene.info = c("membrane","integral component of membrane", "membrane", "integral component of membrane",
                               "nucleic acid binding", "RNA polymerase II regulatory region sequence-specific DNA binding"),
                 stringsAsFactors = F)

РЕШЕНИЕ:

df %>% 
  group_by(Gene.name) %>% 
  mutate(Gene.info.complete = paste0(unique(Gene.info), collapse = ","))

# A tibble: 6 x 3
# Groups:   Gene.name [2]
  Gene.name    Gene.info                                       Gene.info.complete                                             
  <chr>        <chr>                                           <chr>                                                          
1 fam162a      membrane                                        membrane,integral component of membrane                        
2 fam162a      integral component of membrane                  membrane,integral component of membrane                        
3 fam162a      membrane                                        membrane,integral component of membrane                        
4 fam162a      integral component of membrane                  membrane,integral component of membrane                        
5 LOC101885363 nucleic acid binding                            nucleic acid binding,RNA polymerase II regulatory region seque~
6 LOC101885363 RNA polymerase II regulatory region sequence-s~ nucleic acid binding,RNA polymerase II regulatory region seque~
0 голосов
/ 10 мая 2020

Хорошо - я думаю, что это может быть то, что вы ищете ...

Я сделал минимальный пример набора данных - test_data, содержащий некоторые гены и некоторые аннотации.

test_data=data.frame(gene_name=rep(c("gene1","gene2","gene3"),each=4),
    annotation=c("important","interesting","useful","cool","useless","unimportant","boring","dull","neutral","so-so","borderline","average"))

Допустим, у вас есть список имен интересующих вас генов в векторе:

gene_name_list=c("gene1","gene2")

Мы можем использовать это, чтобы получить все аннотации для каждого, разделенные запятыми:

gene_annotations = sapply(gene_name_list,function(gene_name) paste( unique( test_data[test_data[,"gene_name"]==gene_name,"annotation"]), collapse="," ) )
gene_annotations
#                               gene1                               gene2 
# "important,interesting,useful,cool"   "useless,unimportant,boring,dull" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...