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