r - 将具有部分匹配名称的列值合并到 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.11DXX
,GTEX.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
谢谢
解决方案
你的问题来了,因为你的数据集是
- ...在宽格式中,这意味着在列标题中可以找到数据(个人姓名)。这使得查找匹配的 SNP <--> 单个列变得困难。有关宽数据与长数据的信息,请参见此处
- ...实际上是两个数据集,合并在一起。一个是关于转录本与表达的数字(长标题),另一个数据集是转录本与尼安德特人与否。
因此,将组织名称和个人名称放在自己的列中,而不是将它们用作列名!如下所述:
dataset1
创建一个仅包含等位基因计数信息的数据集(我称之为)。通过删除不必要的列来做到这一点。只应保留以下列:- 具有唯一成绩单名称的列
- 模式的列
GTEX.11DXX.1426.SM.5GIDU
dataset2
与上面类似地创建另一个数据集 (-> ),但它仅包括:- 具有唯一成绩单名称的列
- 模式的列
GTEX.11DXX
使用
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 ...
在数据集 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 ...
现在您可以使用
dplyr::full_join(dataset1, dataset2, by = c("transcript", "individual"))
合并等位基因计数和尼安德特人状态。这仅在每个数据集(成绩单,个人)的每个组合仅出现一次时才有效!如果这些列在多行中具有相同的组合,
full_join
则不知道来自哪些行dataset1
并dataset2
属于同一行,并将输出它们的所有组合!
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
...
- 现在您可以将列
count
和isNeandertal