Retrieving all genes for a gene ontology term I'm looking for an easy way to retrieve all the genes in a list that are associated with a certain GO term, preferably using R/Bioconductor packages. I'm not interested in under/overrepresentation or enrichment.
For instance, I want a list of all genes known to be located in 'presynaptic endosome' (GO:009883).
I tried the method referred to in an older post (Retrieve all genes for a specific gene ontology and https://www.biostars.org/p/52101/); following is my code:
ensembl = useMart(&quot;ensembl&quot;,dataset=&quot;hsapiens_gene_ensembl&quot;) #retrieve human.ensembl data via biomaRt

go_1 = c(&quot;GO:0098830&quot;, &quot;GO:0098954&quot;, &quot;GO:0099007&quot;, &quot;GO:0099067&quot;, &quot;GO:0099037&quot;, &quot;GO:0098955&quot;, &quot;GO:0099592&quot;, &quot;GO:0099532&quot;) #GO IDs of all terms associated with &quot;presynaptic endosome&quot; (inclusive of child terms) 

pre.gene.data &lt;- getBM(attributes=c('hgnc_symbol', 'ensembl_gene_id', 'go_id', 'go_linkage_type'),
                    filters = 'go', values = list(go_1), mart = ensembl)

but my code doesn't filter the genes based on the GO terms. It gives me the following output:
GO:0006886 AP3D1 ENSG00000065000 intracellular protein transport IEA
GO:0016192 AP3D1 ENSG00000065000 vesicle-mediated transport IEA
GO:0030117 AP3D1 ENSG00000065000 membrane coat IEA

... and 49 other entries for the gene &quot;AP3D1&quot;

I'm unable to understand what might be the problem. I replaced the filter &quot;go_id&quot; to &quot;go&quot; because of the updated filters used:listFilters(ensembl).
Please help!
It is filtering by your GO terms, it is only giving you genes associated with those GO terms. However the GO terms in the output are not linked to the GO terms in your input, so it is giving you all the GO terms linked to the genes which are associated with the GO terms you filtered by.
Essentially BioMart is not very clever. It has a table of all the GO terms linked to the genes, it filters the genes to only include those linked to the GO terms you've given it. Then it takes that list of genes and queries that same table completely separately, getting the GO terms for each gene.