比较两个大数据帧的内存有效方式是什么

时间:2019-04-12 06:32:06

标签: r awk sed

我想比较两个非常大的数据帧,并在匹配列ID之后做出共识数据帧。

我的第一个数据框(input1)的一部分:

ID  BGC_Class   Start   End BGC_Name    Similarity  MIBiG
GCA_000006785.2_ASM678v2    Bacteriocin 593677  606065  Streptolysin_S  100%    BGC0000566
GCA_000169475.1_ASM16947v1  Bacteriocin 633235  645623  Streptolysin_S  100%    BGC0000566
GCA_000433555.1_MGS126  Bacteriocin 524573  536961  Streptolysin_S  100%    BGC0000566

second(input2):

ID  Species_name    Strain_name
GCA_000169475.1_ASM16947v1  [Ruminococcus]_gnavus   [Ruminococcus]_gnavus_ATCC_29149_strain=ATCC_29149_
GCA_000433555.1_MGS126  [Ruminococcus]_gnavus   [Ruminococcus]_gnavus_CAG:126__

我想匹配两个数据框中的“ ID”列,并在两个数据框中都匹配ID功能后创建一个新的数据框(结果)。因此,在理想情况下,输出数据帧将为:

ID  Species_name    Strain_name BGC_Class   Start   End BGC_Name    Similarity  MIBiG
GCA_000169475.1_ASM16947v1  [Ruminococcus]_gnavus   [Ruminococcus]_gnavus_ATCC_29149_strain=ATCC_29149_ Bacteriocin 633235  645623  Streptolysin_S  100%    BGC0000566
GCA_000433555.1_MGS126  [Ruminococcus]_gnavus   [Ruminococcus]_gnavus_CAG:126__ Bacteriocin 524573  536961  Streptolysin_S  100%    BGC0000566

为此,我尝试了R:

results<-data.frame(merge(input1,input2$ID, by.input1 = "input1$ID", by.input2 = "input2$ID"))

还有:

results <- match(input1$ID, input2$ID)

但是我在两个方面都遇到了相同的错误:

Error: vector memory exhausted (limit reached?)

我想知道在R中是否有任何内存有效的方法?

如果不是,是否可以通过awk / sed脚本来处理这些大型数据集文件? 所有评论表示赞赏。 谢谢。

注意:原始输入文件在这里: https://sites.google.com/site/iicbbioinformatics/share

2 个答案:

答案 0 :(得分:0)

使用left_join应该对您有用:

library(dplyr)
df <- left_join(input2, input1, by = "ID")

答案 1 :(得分:0)

我从未达到Awk中的内存限制;想知道它是否会发生在您身上。

awk -F, 'NR==FNR{a[$1]=$0} NR!=FNR{i=$1; $1=""; print a[i] $0}' input2.csv input1.csv

已更新以反映CSV文件

ID  Species_name    Strain_name BGC_Class Start End BGC_Name Similarity MIBiG
 Bacteriocin 593677 606065 Streptolysin_S 100% BGC0000566
GCA_000169475.1_ASM16947v1  [Ruminococcus]_gnavus   [Ruminococcus]_gnavus_ATCC_29149_strain=ATCC_29149_ Bacteriocin 633235 645623 Streptolysin_S 100% BGC0000566
GCA_000433555.1_MGS126  [Ruminococcus]_gnavus   [Ruminococcus]_gnavus_CAG:126__ Bacteriocin 524573 536961 Streptolysin_S 100% BGC0000566

请注意,由于没有匹配的记录,因此输出的第二行很奇怪。请让我知道您想如何解决这个问题,我将在Awk中制作原型。