通过(部分)正则表达式组合一些行来修改 R 中的数据

Modify data in R by combining some of the rows based on (partially) regular expression

我有一个来自 RNASeq 实验的数据集。

> dim(expression)
[1]   149 39879

像这样:

> expression[1:5, 1:5]
# A tibble: 5 × 5
       sample_id ENSG00000004059 ENSG00000003056 ENSG00000173153 ENSG00000004478
           <chr>           <dbl>           <dbl>           <dbl>           <dbl>
1 123 (Colon)        6.518498        7.141934        5.766983        5.471909
2 121 (Colon)        6.983914        7.078940        5.909575        5.911879
3 004 (Ileum)        6.403912        7.131915        6.191672        5.771549
4 045 (Colon)        6.890916        7.233934        6.019052        6.272799
5 010 (Ileum)        6.674921        7.645998        5.859013        5.322049

第一列称为 "sample_id",在该列中我有如下所示的 ID:“123(结肠)”、“142(回肠)”、“123(回肠)等,其中 123是患者的 ID,结肠和回肠是采集样本的地方。 其余列是基因名称及其表达值。 有时一位患者只有一个样本:结肠或回肠,另一个缺失。 行以 123(冒号)开头,然后是每个基因的其余值。 我想以这样的方式修改我的数据,即我没有为一个患者设置两行,例如 123.colon 和 123.ileum,而是将两者组合在一起的一行。 类似于:“123 colon.gene1 colon.gene2...ileum.gene1 ileum.gene2...”

到目前为止,我能够使用以下代码 select 来自一名患者的数据(两个样本或一个样本):

ptn = '^010.*?'
ndx = grep(ptn, expression$sample_id, perl=T)
selected_rows = expression[ndx,]
selected_rows

不过这只是 select 我想要的信息,像这样:

> selected_rows
# A tibble: 2 × 39,879
       sample_id ENSG00000004099 ENSG00000003956 ENSG00000973153 ENSG00000004498 ENSG00000003139
           <chr>           <dbl>           <dbl>           <dbl>           <dbl>           <dbl>
1 010 (Ileum)        6.674229        7.645929        5.850019        5.322049       0.6259249
2 010 (Colon)        6.861709        6.768619        5.950409        5.752779       0.3727669
# ... with 39873 more variables: ENSG00000003509 <dbl>, ENSG00000001036 <dbl>,

但我不知道如何从这里开始。 我需要连接但仍然跟踪哪个基因表达属于哪个器官。 谢谢。

预期结果为:

sample_id   ENSG1-Ileum ENSG2-ileum ENSG3-Ileum ENSG4-Ileum ENSG5-Ileum… ENSG1-Colon ENSG2-Colon ENSG3-Colon ENSG4-Colon ENSG5-Colon…
010         6.674229 7.645929 5.850019 5.322049 0.625924… 9.861709 6.768619 5.950409 5.752779 0.3727669…
# ... with 39873 more variables: ENSG00000003509 <dbl>, ENSG00000001036 <dbl>,
#

换句话说(去除生物因素): 我该如何转换它:

p_id   g1   g2   g3
p1_a   vn   vn   vn
p1_b   vn   vn   vn
p2_a   vn   vn   vn
p2_b   vn   vn   vn

进入这个:

p_id   g1pa    g2pa    g3pa   g1pb    g2pb    g3pb
p1     vn      vn      vn     vn      vn      vn 
p2     vn      vn      vn     vn      vn      vn

vn 只是浮点数,可能相等也可能不相等

在很多帮助下,这里是解决方案:

library(pbapply)

expressions <- lapply(selected.patients, function(pat) {
  expr.ileum <- expression[sample.info$patient == pat & sample.info$origin == "Ileum",-1]
  expr.colon <- expression[sample.info$patient == pat & sample.info$origin == "Colon",-1]
  expr.comb <- data.frame(Patient = pat, Ileum = expr.ileum, Colon = expr.colon)
  expr.comb
})

library(dplyr)
expression.comb <- bind_rows(expressions)
dim(expression.comb)
expression.comb[1:6, 1:6]
rm(expressions)

这是输出:

> expression.comb[1:6, 1:6]
  Patient Ileum.ENSG58 Ileum.ENSG47 Ileum.ENSG36 Ileum.ENSG56 Ileum.ENSG54
1  SV-121    5.635079    5.538374     3.543571    2.579083     5.2418536
2  07-004    6.403112    2.131415     1.171672    5.771545     0.9711039
3  01-010    1.674221    3.645928     8.850013    2.322047     0.6259241
4  KD-081    6.714947    6.643261     6.328018    9.709639     4.4346171
5  KV-247    6.771593    2.798890     6.370311    1.830785     5.5326661
6  MK-101    6.312121    2.570204     2.632856    3.402819     5.6695553