R:比较字符串在多个数据帧中的存在
R: Comparing the presence of a string in multiple dataframes
我有 6 个数据帧:
DvE.+
DvE.-
DvS.+
DvS.-
EvS.+
EvS.-
它们都有相似的结构:
gene FDR log2FC annotation
10 c10001_g1_i1|m.32256 4.638831e-02 -0.9888892 [Genbank]glutaredoxin/malate transporter fusion protein [Chlamydomonas reinhardtii]
33 c10006_g3_i4|m.32310 7.826191e-07 -1.3364432 [Tigrfam]ChlG: chlorophyll synthase ChlG
47 c10010_g1_i4|m.32346 8.609296e-15 1.9188013 [Genbank]conserved unknown protein [Ectocarpus siliculosus]
48 c10010_g1_i4|m.32348 5.625766e-09 1.8240089 [Genbank]hypothetical protein THAOC_07134 [Thalassiosira oceanica]
81 c10018_g2_i1|m.32429 2.008500e-04 -0.9899947
89 c10020_g1_i2|m.32459 4.930879e-04 -1.1283138 [Pfam]Zinc-binding dehydrogenase
我想比较每个数据框中存在的基因("gene" 列中的所有字符串),以查看多个数据框中存在哪些基因,这样在比较之后,我会得到一个新数据框告诉我哪个基因存在于哪个数据框中,例如:
gene DvE.+ DvE.- DvS.+ DvS.- EvS.+ EvS.-
c10001_g1_i1|m.32256 0 1 1 0 0 0
c10010_g1_i4|m.32348 1 0 0 0 1 0
其中 0 和 1 表示存在或不存在。
输出不一定必须像这样或使用 0 和 1,但可以很容易地分辨出哪个基因存在于哪个数据帧中。
我要做的第一件事是将 dfs 重命名为 "legit" R 名称,例如:
- DvE.plus
- DvE.minus
等等。
然后我会得到所有基因的列表(在这个演示中我将只使用 2 个假设的数据帧);
all.genes <- unique(c(DvE.plus$gene, DvE.minus$gene))
然后为了方便起见,我会将数据帧重新组合到列表中
my.dfs <- list(DvE.plus = DvE.plus, DvE.minus = DvE.minus)
然后初始化生成的数据帧
options(stringsAsFactors = FALSE)
result.df <- data.frame(gene=character(0), DvE.plus = numeric(0),
DvE.minus = numeric(0))
然后使用以下循环我会得到我想要的:
for(gene.num in seq_along(all.genes)) {
result.df[gene.num, "gene"] <- all.genes[gene.num]
for(df.name in names(my.dfs)) {
result.df[gene.num,df.name] <- all.genes[gene.num] %in% my.dfs[[df.name]]$gene
}
}
生成的数据框将如下所示:
result.df
gene DvE.plus DvE.minus
1 c10001_g1_i1|m.32256 1 0
2 c10006_g3_i4|m.32310 1 0
3 c10010_g1_i4|m.32346 1 0
4 c10010_g1_i4|m.32348 0 1
5 c10018_g2_i1|m.32429 0 1
6 c10020_g1_i2|m.32459 0 1
我有 6 个数据帧:
DvE.+
DvE.-
DvS.+
DvS.-
EvS.+
EvS.-
它们都有相似的结构:
gene FDR log2FC annotation
10 c10001_g1_i1|m.32256 4.638831e-02 -0.9888892 [Genbank]glutaredoxin/malate transporter fusion protein [Chlamydomonas reinhardtii]
33 c10006_g3_i4|m.32310 7.826191e-07 -1.3364432 [Tigrfam]ChlG: chlorophyll synthase ChlG
47 c10010_g1_i4|m.32346 8.609296e-15 1.9188013 [Genbank]conserved unknown protein [Ectocarpus siliculosus]
48 c10010_g1_i4|m.32348 5.625766e-09 1.8240089 [Genbank]hypothetical protein THAOC_07134 [Thalassiosira oceanica]
81 c10018_g2_i1|m.32429 2.008500e-04 -0.9899947
89 c10020_g1_i2|m.32459 4.930879e-04 -1.1283138 [Pfam]Zinc-binding dehydrogenase
我想比较每个数据框中存在的基因("gene" 列中的所有字符串),以查看多个数据框中存在哪些基因,这样在比较之后,我会得到一个新数据框告诉我哪个基因存在于哪个数据框中,例如:
gene DvE.+ DvE.- DvS.+ DvS.- EvS.+ EvS.-
c10001_g1_i1|m.32256 0 1 1 0 0 0
c10010_g1_i4|m.32348 1 0 0 0 1 0
其中 0 和 1 表示存在或不存在。
输出不一定必须像这样或使用 0 和 1,但可以很容易地分辨出哪个基因存在于哪个数据帧中。
我要做的第一件事是将 dfs 重命名为 "legit" R 名称,例如:
- DvE.plus
- DvE.minus
等等。
然后我会得到所有基因的列表(在这个演示中我将只使用 2 个假设的数据帧);
all.genes <- unique(c(DvE.plus$gene, DvE.minus$gene))
然后为了方便起见,我会将数据帧重新组合到列表中
my.dfs <- list(DvE.plus = DvE.plus, DvE.minus = DvE.minus)
然后初始化生成的数据帧
options(stringsAsFactors = FALSE)
result.df <- data.frame(gene=character(0), DvE.plus = numeric(0),
DvE.minus = numeric(0))
然后使用以下循环我会得到我想要的:
for(gene.num in seq_along(all.genes)) {
result.df[gene.num, "gene"] <- all.genes[gene.num]
for(df.name in names(my.dfs)) {
result.df[gene.num,df.name] <- all.genes[gene.num] %in% my.dfs[[df.name]]$gene
}
}
生成的数据框将如下所示:
result.df
gene DvE.plus DvE.minus
1 c10001_g1_i1|m.32256 1 0
2 c10006_g3_i4|m.32310 1 0
3 c10010_g1_i4|m.32346 1 0
4 c10010_g1_i4|m.32348 0 1
5 c10018_g2_i1|m.32429 0 1
6 c10020_g1_i2|m.32459 0 1