通过(部分)正则表达式组合一些行来修改 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
我有一个来自 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