首页 > 解决方案 > 如何匹配两个不同表的列中的值以提取 R 中第二个表的不同列中的对应值?

问题描述

我知道这是一个基本的事情,肯定已经被问到了,但我找不到适合我正在寻找的东西,而且我在 R 中有点生疏。

我有一个名为的表snpMap,其中包含两组基因组坐标,一组是旧的,另一组是新的。我有一个输出表,它意外地以旧的基因组坐标格式编码,称为bim. 我想要做的是匹配两个不同表之间的列,基于它们共同的“旧”基因组坐标列,然后从中提取“新”基因组坐标snpMap并将它们放入bim. 我知道这就像使用查找表一样,这是我以前做过的事情,但就像我说的,我有点生疏了。

因为基因组坐标被分解成单独的列,例如染色体和坐标,我将它们连接到两个表中以使过程更容易一些:

snpMap$hg19_coords <- with(snpMap, paste0("chr", CHR, "-", POS))
snpMap$hg38_coords <- with(snpMap, paste0(chr_hg38, "-", pos_hg38))

bim$hg19_coords <- with(bim, paste0("chr", chr, "-", basepair))

哪里hg19是旧的,哪里hg38是新的。下面是参考表,snpMap

                       CHR                    SNP CM    POS COUNTED ALT Type
rs4951929:757734:C:T     1   rs4951929:757734:C:T  0 757734       C   T  SNV
rs4951862:757936:C:A     1   rs4951862:757936:C:A  0 757936       C   A  SNV
rs3131954:758626:C:T     1   rs3131954:758626:C:T  0 758626       C   T  SNV
rs114111569:759837:T:A   1 rs114111569:759837:T:A  0 759837       T   A  SNV
rs112618790:777232:C:T   1 rs112618790:777232:C:T  0 777232       T   C  SNV
rs4040617                1              rs4040617  0 779322       G   A  SNV
                       newRef newCount        name  rsNumGuess chr_hg38
rs4951929:757734:C:T        T        C   rs4951929   rs4951929     chr1
rs4951862:757936:C:A        A        C   rs4951862   rs4951862     chr1
rs3131954:758626:C:T        T        C   rs3131954   rs3131954     chr1
rs114111569:759837:T:A      A        T rs114111569 rs114111569     chr1
rs112618790:777232:C:T      C        T rs112618790 rs112618790     chr1
rs4040617                   A        G   rs4040617   rs4040617     chr1
                       pos_hg38 hg19_coords hg38_coords
rs4951929:757734:C:T     822354 chr1-757734 chr1-822354
rs4951862:757936:C:A     822556 chr1-757936 chr1-822556
rs3131954:758626:C:T     823246 chr1-758626 chr1-823246
rs114111569:759837:T:A   824457 chr1-759837 chr1-824457
rs112618790:777232:C:T   841852 chr1-777232 chr1-841852
rs4040617                843942 chr1-779322 chr1-843942

旧坐标是CHRand POS(我已经连接到hg19_coords),新坐标是chr_hg38and (pos_hg38我也连接到hg38_coords)。

下面是输出表bim

> head(bim)
   chr                    snp position basepair allele1 allele2 hg19_coords
1:   1   rs4951929:757734:C:T        0   757734       C       T chr1-757734
2:   1   rs4951862:757936:C:A        0   757936       C       A chr1-757936
3:   1   rs3131954:758626:C:T        0   758626       C       T chr1-758626
4:   1 rs114111569:759837:T:A        0   759837       T       A chr1-759837
5:   1 rs112618790:777232:C:T        0   777232       T       C chr1-777232
6:   1              rs4040617        0   779322       G       A chr1-779322

我想用作为“键”chrbasepair相应hg38值替换列。hg19_coords最终,我也想替换其中的值,snp但那是另一回事。

我应该如何处理这个?这就是全部data.table

标签: r

解决方案


可能是一个不优雅的解决方案,但这里是:

bimjoin <- bim %>%
    left_join(snpMap, by = "hg19_coords") %>%
    subset(., select = c("chr_hg38", "snp", "position", "pos_hg38", "allele1", "allele2"))


推荐阅读