2016-12-30 5 views
0

У меня есть набор данных, который исходит из эксперимента RNASeq.Изменение данных в R путем объединения некоторых строк на основе (частично) регулярного выражения

> 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", и в этом столбце у меня есть идентификаторы, которые выглядят следующим образом: "123 (двоеточие)", "142 (подвздошной)" , 123 (илеум) и т. Д., Где 123 - это идентификатор пациента, а двоеточие и подвздошная кишка - это место, где взяты образцы. Остальные столбцы представляют собой имена генов и их значения экспрессии. Иногда у одного пациента имеется только один образец : двоеточие или подвздошная кишка, другая отсутствует. Строки начинаются с 123 (двоеточие), а затем остальные значения для каждого гена. Я хочу изменить свои данные таким образом, что у меня нет двух строк для одного пациента, например, 123.colon и 123.ileum, но одна строка, объединяющая две. Что-то вроде: «123 colon.gene1 colon.gene2 ... ileum.gene1 ileum.gene2 ...»

До сих пор мне удалось выбрать данные у одного пациента (два образца или только один, если случай) с этим кодом:

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

Это, однако, только выбирает информацию, которую я хочу, как это:

> 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 are are просто плавающей точки, которые могут или не могут быть равны

+0

Может быть, вы хотите, чтобы изменить ширину? См. [Этот пост] (http://stackoverflow.com/questions/5890584/how-to-reshape-data-from-long-to-wide-format). – lmo

+0

Можете ли вы добавить пример того, как вы хотите получить результат. Это почти наверняка всего лишь случай изменения данных (возможно, в длинном формате с использованием «расплава»). Но без точного определения того, что вы хотите, невозможно дать точный ответ. В зависимости от формата, который вы хотите, почти наверняка уже есть ответ на этом сайте, показывающий, как это сделать. – dww

+0

Я хочу, чтобы это выглядело примерно так: 123 colon.gene1 colon.gene2 ... ileum.gene1 ileum.gene2 ... а затем следующий пациент, скажем 124 с colon.gene1 colon.gene2 ... ileum.gene1 ileum.gene2 ... где 123 и 124 имеет место прежней sample_id.В основном слово двоеточие уходит от sample_id и заменяет себя после каждого гена, который поступает из образца «двоеточия»; то же самое для «подвздошной кишки» – Megiddo

ответ

0

С большим количеством помощи, вот решение:

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