2016-08-09 4 views
0

У меня есть таблица, которую я пытаюсь нормализовать по определенному подмножеству средств внутри одного столбца на основе переменной в другом столбце. В идеале мой код разделил бы все данные в столбце coverage_depth для определенной переменной деформации (например, 2987) средним подмножеством того же столбца (глубина покрытия только для SAG1 в столбце chr только для 2987 в колонка деформации)Нормализация данных на основе подмножества Среднее значение в R

Я нашел длинный способ сделать это, но я действительно надеюсь, что у кого-то есть способ сделать этот цикл таким образом, что мне не нужно вводить средства вручную после их вычисления.

Моя таблица выглядит следующим образом:

B1 1073 320 2987 
B1 1074 324 2987 
B1 1075 330 2987 
SAG1 955 31 2987 
SAG1 956 30 2987 
SAG1 957 29 2987 
SAG1 958 29 2987 
BTub 446 57 2987 
BTub 452 59 2987 
B1 1707 53 GRE_MIG 
B1 1708 56 GRE_MIG 
18S 1099 242 GRE_MIG 
18S 1100 242 GRE_MIG 
SAG1 888 7 GRE_MIG 
SAG1 889 7 GRE_MIG 
SAG1 890 7 GRE_MIG 

Сначала я нагрузка в моей таблице:

reads<-read.table("3133_all.CNV.txt", sep = "\t", header = F) 
colnames(reads)<-c("chr", "position", "coverage_depth", "strains" 

Тогда я вызываю plyr вычислить среднее coverage_depth всех комбинаций КПЧ и штаммов колонны

library(plyr) 
    coverage_summary<-ddply(reads, c("chr", "strains"), summarise, mean = mean(coverage_depth)) 
    write.csv(format(coverage_summary, scientific=FALSE), file = "CNV_mean_07.27.16.csv", row.names = F) 

, который дает мне более длинную версию этого:

 chr strains   mean 
1 18S  2987 2.052802e+03 
20 18S GRE_MIG 2.674536e+01 
126 B1 GRE_MIG 6.503342e+01 
213 SAG1  2987 3.422057e+01 
232 SAG1 GRE_MIG 5.863501e+00 

Я понял, как нормализовать все coverage_depth штамма по среднему, которое я получаю от этого штамма на CHR SAG1, который я вручную положить в примерно так:

NormalizeSAG1<-function(coverage_depth, strains){ 
    if (strains %in% c("2987")) { 
    coverage_depth<-coverage_depth/3.42 
    } else if (strains %in% c("GRE_MIG")) { 
    coverage_depth<-coverage_depth/5.86  
    } else { coverage.norm<-coverage_depth 
    }} 
reads$SAG1_normalized<-mapply(NormalizeSAG1, reads$coverage_depth, reads$strains) 

Проблема заключается в том что у меня 53 разных штамма, которые я хочу нормализовать на основе среднего значения на их SAG1 в столбце chr. Кажется, что, возможно, цикл for будет делать это, но я не могу понять, как правильно подмножить мои данные для нормализации без тонны утверждений ifelse.

ответ

1

Попробуйте следующее:

reads <- merge(reads, coverage_summary) 
reads <- mutate(reads, normalized = coverage_depth/mean) 

В принципе, это должно присоединиться к сводной колонне обратно в ваши исходные данные, после чего, создавая нормированный столбец должно быть тривиальными. Это также позволяет избежать создания настраиваемой функции, которая учитывает 53 различных возможных значения.

+0

Но мой исходный столбец имеет более 5 тыс. Записей, в то время как мой итоговый столбец имеет только 200, поэтому я не уверен, что я должен присоединиться к ним так. Есть ли способ указать на конкретное значение в моем резюме, чтобы я мог иметь каждое значение определенного напряжения, деленное на подмножество этих данных? – Xenarat

+0

Функция merge() автоматически сопоставляет два кадра данных с столбцами, которые у них есть, и реплицирует значения в несогласованных столбцах по мере необходимости. Из того, что вы описали, это должно делать то, что вам нужно. – jdobres

+0

Это сработало красиво! Сначала я подбираю данные plyr, а затем объединяюсь с переменной, которую я хотел, и получился красиво, без перестановки по 53 отдельным переменным деформации. Спасибо! – Xenarat

Смежные вопросы