【问题标题】:Issue with Join results in more than 2^31 rows连接结果超过 2^31 行的问题
【发布时间】:2019-10-29 02:55:04
【问题描述】:

我有两个巨大的数据框:

 > dim(res)
[1] 111478253         8
> dim(asign)
[1] 107371528         5

我想通过 "chr" 和 "pos" 合并它们

> head(res)
    chr   pos a1 a2  a3         variant_id pval_nominal           gene_id
1: chr1 54490  G  A b38 chr1_54490_G_A_b38     0.608495 ENSG00000227232.5
2: chr1 58814  G  A b38 chr1_58814_G_A_b38     0.295211 ENSG00000227232.5
3: chr1 60351  A  G b38 chr1_60351_A_G_b38     0.439788 ENSG00000227232.5
4: chr1 61920  G  A b38 chr1_61920_G_A_b38     0.319528 ENSG00000227232.5
5: chr1 63671  G  A b38 chr1_63671_G_A_b38     0.237739 ENSG00000227232.5
6: chr1 64931  G  A b38 chr1_64931_G_A_b38     0.276679 ENSG00000227232.5
> head(asign)
          gene  chr                chr_pos   pos p.val.Retina
1: ENSG00000227232 chr1           1:10177:A:AC 10177     0.381708
2: ENSG00000227232 chr1 rs145072688:10352:T:TA 10352     0.959523
3: ENSG00000227232 chr1            1:11008:C:G 11008     0.218132
4: ENSG00000227232 chr1            1:11012:C:G 11012     0.218132
5: ENSG00000227232 chr1            1:13110:G:A 13110     0.998262
6: ENSG00000227232 chr1  rs201725126:13116:T:G 13116     0.438572

> m=merge(res, asign, by = c("chr", "pos"))
Error in vecseq(f__, len__, if (allow.cartesian || notjoin ||    !anyDuplicated(f__,  : 
  Join results in more than 2^31 rows (internal vecseq reached   physical limit). Very likely misspecified join. Check for duplicate key values in i each of which join to the same group in x over and over again. If that's ok, try by=.EACHI to run j for each group to avoid the large allocation. Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and data.table issue tracker for advice.

我尝试使用 by=.EACHI,但得到了同样的错误。

我只需要保持匹配的最终合并文件:“chr”、“pos”、“pval_nominal”、“p.val.Retina”

我只需要“res”和“asign”数据帧之间的共同行。

我可以从这两个数据框中删除我不需要的列,我得到了这个:

> head(asignx)
   chr   pos     p.val.Retina
1: chr1 10177     0.381708
2: chr1 10352     0.959523
3: chr1 11008     0.218132
4: chr1 11012     0.218132
5: chr1 13110     0.998262
6: chr1 13116     0.438572
> head(l4x)
    chr   pos     pval_nominal
1: chr1 13550     0.375614
2: chr1 14671     0.474708
3: chr1 14677     0.699887
4: chr1 16841     0.127895
5: chr1 16856     0.627822
6: chr1 17005     0.802803

但是当我尝试合并这些时:

> m=merge(l4x,asignx, by = c("chr", "pos"),all.x=FALSE,all.y=FALSE)
Error in vecseq(f__, len__, if (allow.cartesian || notjoin ||   !anyDuplicated(f__,  : 
  Join results in more than 2^31 rows (internal vecseq reached physical    limit)

【问题讨论】:

  • 你能试试m=merge(res, asign, by = c("chr", "pos"),all.x=FALSE,all.y=FALSE)吗?
  • 我试过了,和上面一样的错误:Join results in more than 2^31 rows ....
  • 如果你这样做dim(unique(asignx[,c("chr", "pos")])dim(unique(14x[,c("chr", "pos")])你会得到什么?
  • 因此在任一表中都没有唯一的 chr 和 pos 组合。
  • 如果您希望每个表在这些列上都是唯一的,请确定它们不唯一的原因,修复它,然后执行连接。如果数据正确,那么我建议在 SQL 中执行此操作。

标签: r data.table


【解决方案1】:

假设您的两个数据框都加载到数据库中(您必须设置一个数据库,如 postgres 或 sql server),则 sql 等效于:

m=merge(res, asign, by = c("chr", "pos"))

select *
into m_table
from res 
join asign
on res.chr = asign.chr
and res.pos = asign.pos

然后你将有一个新表:

select *
from m_table;

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2015-05-27
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多