How to create a vector from common elements in vectors R

I have several gene vector vectors containing the names of the species in which they are found, and I made an UpSetR graph to show the number of species found between genes. Now I would like to do the opposite: determining the number of common genes among species, but I do not know how to do this.

An example of what I have:

gene1 <- c("Panda", "Dog", "Chicken")
gene2 <- c("Human", "Panda", "Dog")
gene3 <- c("Human", "Panda", "Chicken")  
...#About 20+ genes with 100+ species each

An example of what I would like to have as a result:

Panda <- c("gene1", "gene2", "gene3")
Dog <- c("gene1", "gene2")
Human <- c("gene2", "gene3")
Chicken <- c("gene1", "gene3")
...  

I know this is conceptually easy, but logically more complicated. Can someone give me a hint?

Thank!

+4
source share
4 answers

You can use unstackfrom base R:

unstack(stack(mget(ls(pattern="gene"))),ind~values)
$Chicken
[1] "gene1" "gene3"

$Dog
[1] "gene1" "gene2"

$Human
[1] "gene2" "gene3"

$Panda
[1] "gene1" "gene2" "gene3"

You can list this on Wednesday with the function list2env

Structure:

 l = mget(ls(pattern="gene"))#get all the genes in a list
 m = unstack(stack(l),ind~values)# Stack them, then unstack with the required formula
 m
$Chicken
[1] "gene1" "gene3"

$Dog
[1] "gene1" "gene2"

$Human
[1] "gene2" "gene3"

$Panda
[1] "gene1" "gene2" "gene3"

 list2env(m,.GlobalEnv)
 Dog
 [1] "gene1" "gene2"
+6
source

, , gene ,

genes <- list(gene1 = gene1, gene2 = gene2, gene3 = gene3)

R-

genes.v <- unlist(genes)
names(genes.v) <- rep(names(genes), times = lengths(genes))
species <- lapply(unique(genes.v), function(g) names(genes.v)[g == genes.v])
names(species) <- unique(genes.v)
species
# $Panda
# [1] "gene1" "gene2" "gene3"
#
# $Dog
# [1] "gene1" "gene2"
#
# $Chicken
# [1] "gene1" "gene3"
#
# $Human
# [1] "gene2" "gene3"

genes.v - , . , , , gene1, gene11 gene12. , . , , .

+2

, . .

genes <- list(
    gene1 = c("Panda", "Dog", "Chicken"),
    gene2 = c("Human", "Panda", "Dog"),
    gene3 = c("Human", "Panda", "Chicken")
)

.

species <- unique(unlist(genes))

> species
[1] "Panda"   "Dog"     "Chicken" "Human" 

, . Map ( lapply, Map):

get_genes_for_species <- function(s) {
    contained <- unlist(Map(function(gene) s %in% gene, genes))
    names(genes)[contained]
}
genes_per_species <- Map(get_genes_for_species, species)

, , , .

> genes_per_species
$Panda
[1] "gene1" "gene2" "gene3"

$Dog
[1] "gene1" "gene2"

$Chicken
[1] "gene1" "gene3"

$Human
[1] "gene2" "gene3"
+2

.

gene  <-unique(c(gene1,gene2,gene3))
TF    <-data.frame(Species = gene)

TF$gene1 <- gene%in%gene1
TF$gene2 <- gene%in%gene2
TF$gene3 <- gene%in%gene3

> TF
  Species gene1 gene2 gene3
1   Panda  TRUE  TRUE  TRUE
2     Dog  TRUE  TRUE FALSE
3 Chicken  TRUE FALSE  TRUE
4   Human FALSE  TRUE  TRUE
+1
source

Source: https://habr.com/ru/post/1695075/


All Articles