首页 > 解决方案 > 将具有部分匹配名称的列值合并到 R 中的一个分号分隔的字段中

问题描述

我已经查看了 SO 并没有找到任何可以准确解释我正在寻找的建议。

我有一张大桌子。前几列包含有关不同表达转录本和影响它的 SNP 的信息。其余的列(其中大约有一千个)是有关个人组织样本的信息(带有列标题,例如GTEX.11DXX.1426.SM.5GIDU)或个人的 ID ( GTEX.11DXX)。这些列下的信息分别包含92在该特定序列处表达的转录物的数量(例如)和表示影响该转录物表达的等位基因是否是尼安德特人遗传的二进制值(1 or 0)。

我想要做的是将二进制列下的数据与成绩单编号列下的数据合并,如下所示:

GTEX.11DXX.1426.SM.5GIDU
0;25
1;74
1;104
1;92
0;12
...
etc.

我想通过部分匹配列名来实现这一点GTEX.11DXXGTEX.11DXX.1426.SM.5GIDU然后去掉二进制列,所以它只是长列名。

我试过使用tidyverse's map(v, ~select_(ovary, ~matches(.))),它有点工作,但即使一个字符关闭,它也匹配,如下所示:

[[49]]
       GTEX.13X6H.1026.SM.5SIBE GTEX.13X6H GTEX.13X6I GTEX.13X6J GTEX.13X6K
    1:                       49          0          0          0          1
    2:                       44          0          0          0          1
    3:                        3          0          0          0          1
    4:                       23          0          0          0          1
    5:                       78          0          0          0          1
   ---                                                                     
80285:                       84          1          0          0          0
80286:                        1          1          0          0          0
80287:                        0          1          0          0          0
80288:                      152          1          0          0          0
80289:                      120          1          0          0          0

同样,我想像这样工作:

       GTEX.13X6H.1026.SM.5SIBE
    1:                     0;49
    2:                     0;44
    3:                      0;3
    4:                     0;23

谢谢

标签: r

解决方案


你的问题来了,因为你的数据集是

  • ...在宽格式中,这意味着在列标题中可以找到数据(个人姓名)。这使得查找匹配的 SNP <--> 单个列变得困难。有关宽数据与长数据的信息,请参见此处
  • ...实际上是两个数据集,合并在一起。一个是关于转录本表达的数字(长标题),另一个数据集是转录本尼安德特人与否。

因此,将组织名称和个人名称放在自己的列中,而不是将它们用作列名!如下所述:

  1. dataset1创建一个仅包含等位基因计数信息的数据集(我称之为)。通过删除不必要的列来做到这一点。只应保留以下列:

    • 具有唯一成绩单名称的列
    • 模式的列GTEX.11DXX.1426.SM.5GIDU
  2. dataset2与上面类似地创建另一个数据集 (-> ),但它仅包括:

    • 具有唯一成绩单名称的列
    • 模式的列GTEX.11DXX
  3. 使用tidyr::gather或更新的tidyr::pivot*(我还没有经验)dataset1看起来像这样

     transcript    tissue                    count
     A             GTEX.13X6H.1026.SM.5SIBE  49
     B             GTEX.13X6H.1026.SM.5SIBE  44
     C             GTEX.13X6H.1026.SM.5SIBE   3
     ...
     A             GTEX.13X6I.1026.SM.5SIBE  10
     B             GTEX.13X6I.1026.SM.5SIBE  11
     ...
    

    像这样dataset2

     transcript    individual   isNeandertal
     A             GTEX.13X6H   0
     B             GTEX.13X6H   0
     ...
     A             GTEX.13X6I   0           
     B             GTEX.13X6I   0
     ...
    
  4. 在数据集 1 中,从组织名称中获取个体名称,使数据集如下所示:

    transcript    tissue                    individual  count
    A             GTEX.13X6H.1026.SM.5SIBE  GTEX.13X6H  49
    B             GTEX.13X6H.1026.SM.5SIBE  GTEX.13X6H  44
    C             GTEX.13X6H.1026.SM.5SIBE  GTEX.13X6H   3
    ...
    A             GTEX.13X6I.1026.SM.5SIBE  GTEX.13X6I  10
    B             GTEX.13X6I.1026.SM.5SIBE  GTEX.13X6I  11
    ...
    
  5. 现在您可以使用dplyr::full_join(dataset1, dataset2, by = c("transcript", "individual"))合并等位基因计数和尼安德特人状态。

    这仅在每个数据集(成绩单,个人)的每个组合仅出现一次时才有效!如果这些列在多行中具有相同的组合,full_join则不知道来自哪些行dataset1dataset2属于同一行,并将输出它们的所有组合!


    stopifnot(!anyDuplicated(dataset1[, c("transcript", "individual")]))通过and
    stopifnot(!anyDuplicated(dataset2[, c("transcript", "individual")]))(当然,用你的变量名)检查这个

此步骤的结果应如下所示:

    transcript    tissue                    individual  count  isNeandertal
    A             GTEX.13X6H.1026.SM.5SIBE  GTEX.13X6H  49     0
    B             GTEX.13X6H.1026.SM.5SIBE  GTEX.13X6H  44     0
    C             GTEX.13X6H.1026.SM.5SIBE  GTEX.13X6H   3     0
    ...
    A             GTEX.13X6I.1026.SM.5SIBE  GTEX.13X6I  10     0
    B             GTEX.13X6I.1026.SM.5SIBE  GTEX.13X6I  11     0
    ...
  1. 现在您可以将列countisNeandertal

推荐阅读