如何从向量 R 中的共同元素创建向量
How to create a vector from elements in common in vectors R
我有几个基因特征向量,其中包含发现它们的物种的名称,我制作了一个 UpSetR 图来显示基因间共有的物种数量。现在我想做相反的事情:绘制物种间共有基因的数量,但我不知道该怎么做。
我所拥有的示例:
gene1 <- c("Panda", "Dog", "Chicken")
gene2 <- c("Human", "Panda", "Dog")
gene3 <- c("Human", "Panda", "Chicken")
...#About 20+ genes with 100+ species each
我想要的结果示例:
Panda <- c("gene1", "gene2", "gene3")
Dog <- c("gene1", "gene2")
Human <- c("gene2", "gene3")
Chicken <- c("gene1", "gene3")
...
我知道这在概念上很简单,但逻辑上更复杂。谁能给我一个线索?
谢谢!
你可以试试这个。
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
首先,我认为对于大多数用途来说,最好将 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
。这就是我在第二行中修复的内容。然后在第三行我遍历了所有物种并创建了结果列表,除了在第四行我添加了物种名称。
您可以使用基数 R:
中的 unstack
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"
您最终可以通过 list2env
函数
将其列入环境
细分:
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"
首先将数据放入列表中。这使得它更容易使用。
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"
这是一个包含 tidyverse 并将结果放在整洁数据框中的变体。
诀窍是将结果与 str_c
和 summarise
连接起来。
tibble(gene1 = gene1,
gene2 = gene2,
gene3 = gene3) %>%
gather(gene_name, gene_type) %>%
group_by(gene_type) %>%
summarise(genes = str_c(gene_name, collapse = ", "))
# A tibble: 4 x 2
gene_type genes
<chr> <chr>
1 Chicken gene1, gene3
2 Dog gene1, gene2
3 Human gene2, gene3
4 Panda gene1, gene2, gene3
我同意 Julius(上文)的观点,即存储基因向量的最佳方式是使用列表。命名列表会更好,如:
my_gene_list <- set_names(list(gene1, gene2, gene3), str_c("gene", 1:3) )
这会产生相同的结果...
my_gene_list %>% as_tibble() %>%
gather(gene_name, gene_type) %>%
group_by(gene_type) %>%
summarise(genes = str_c(gene_name, collapse = ", "))
# A tibble: 4 x 2
gene_type genes
<chr> <chr>
1 Chicken gene1, gene3
2 Dog gene1, gene2
3 Human gene2, gene3
4 Panda gene1, gene2, gene3
我有几个基因特征向量,其中包含发现它们的物种的名称,我制作了一个 UpSetR 图来显示基因间共有的物种数量。现在我想做相反的事情:绘制物种间共有基因的数量,但我不知道该怎么做。
我所拥有的示例:
gene1 <- c("Panda", "Dog", "Chicken")
gene2 <- c("Human", "Panda", "Dog")
gene3 <- c("Human", "Panda", "Chicken")
...#About 20+ genes with 100+ species each
我想要的结果示例:
Panda <- c("gene1", "gene2", "gene3")
Dog <- c("gene1", "gene2")
Human <- c("gene2", "gene3")
Chicken <- c("gene1", "gene3")
...
我知道这在概念上很简单,但逻辑上更复杂。谁能给我一个线索?
谢谢!
你可以试试这个。
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
首先,我认为对于大多数用途来说,最好将 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
。这就是我在第二行中修复的内容。然后在第三行我遍历了所有物种并创建了结果列表,除了在第四行我添加了物种名称。
您可以使用基数 R:
中的unstack
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"
您最终可以通过 list2env
函数
细分:
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"
首先将数据放入列表中。这使得它更容易使用。
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"
这是一个包含 tidyverse 并将结果放在整洁数据框中的变体。
诀窍是将结果与 str_c
和 summarise
连接起来。
tibble(gene1 = gene1,
gene2 = gene2,
gene3 = gene3) %>%
gather(gene_name, gene_type) %>%
group_by(gene_type) %>%
summarise(genes = str_c(gene_name, collapse = ", "))
# A tibble: 4 x 2
gene_type genes
<chr> <chr>
1 Chicken gene1, gene3
2 Dog gene1, gene2
3 Human gene2, gene3
4 Panda gene1, gene2, gene3
我同意 Julius(上文)的观点,即存储基因向量的最佳方式是使用列表。命名列表会更好,如:
my_gene_list <- set_names(list(gene1, gene2, gene3), str_c("gene", 1:3) )
这会产生相同的结果...
my_gene_list %>% as_tibble() %>%
gather(gene_name, gene_type) %>%
group_by(gene_type) %>%
summarise(genes = str_c(gene_name, collapse = ", "))
# A tibble: 4 x 2
gene_type genes
<chr> <chr>
1 Chicken gene1, gene3
2 Dog gene1, gene2
3 Human gene2, gene3
4 Panda gene1, gene2, gene3