R:比较多个数据帧中字符串的存在

时间:2015-03-09 01:41:28

标签: r comparison dataframe

我有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                 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和1s,但是很容易分辨哪个基因出现在哪个数据帧中。

1 个答案:

答案 0 :(得分:0)

我要做的第一件事就是将dfs重命名为“合法”的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