2015-07-21 2 views
-3

Я хотел бы изменить этот набор данных в соответствии с этим примером:Условный цикл на линию

data<- read.table (text=" 
     V1 V2 V3 V4 V5 V6 V7 V8 
Chr10_247 T C CC241=miss CC332=het CC37=ref CC88=ref CC886=het 
Chr10_445 G T CC241=ref CC332=ref CC37=het CC88=ref CC886=het 
Chr10_447 A C CC241=homo CC332=homo CC37=homo CC88=homo CC886=homo 
Chr10_481 C T CC241=ref CC332=het CC37=het CC88=ref CC886=het 
Chr10_517 G A CC241=homo CC332=het CC37=ref CC88=homo CC886=het 
Chr10_637 A G CC241=het CC332=ref CC37=het CC88=het CC886=het" 
    stringsAsFactors = FALSE,row.names = NULL,header = T) 

в V1 является физическое положение в геноме (Chr10_247), V2 является опорным локусы, V3 является необязательным loci, V4, V5, V6, V7, V8 - индивидуумы. Так, в которой линия, мне нужно, что:

Exemple с помощью "A" в V2 и B в V3

Change *=ref per 2*V2  A B AA - *ref 
Change *=homo per 2*V3  A B BB - *homo 
Change *=het per (V2*V3) A B AB - *hete 
Change *=miss per NA  A B NA - *miss 

ожидаемый результат:

V1 V2 V3 V4 V5 V6 V7 V8 
Chr10_247 T C NA TC TT TT TT 
Chr10_445 G T GG GG GT GG GT 
Chr10_447 A C CC CC CC CC CC 
Chr10_481 C T CC CT CT CC CT 
Chr10_517 G A AA GA GG AA GA 
Chr10_637 A G AG AA AG AG AG 

ответ

1

Вот начало решения, это относительно прямоформатная проблема преобразования данных.

library(reshape2) 


data <- read.table(text=" 
        V1 V2 V3 V4 V5 V6 V7 V8 
Chr10_247 T C CC241=miss CC332=het CC37=ref CC88=ref CC886=het 
        Chr10_445 G T CC241=ref CC332=ref CC37=het CC88=ref CC886=het 
        Chr10_447 A C CC241=homo CC332=homo CC37=homo CC88=homo CC886=homo 
        Chr10_481 C T CC241=ref CC332=het CC37=het CC88=ref CC886=het 
        Chr10_517 G A CC241=homo CC332=het CC37=ref CC88=homo CC886=het 
        Chr10_637 A G CC241=het CC332=ref CC37=het CC88=het CC886=het", 
        stringsAsFactors = FALSE,row.names = NULL,header = T) 

#melt data for easy vectorized operations 
m_data <- melt(data, id.vars=c("V1","V2","V3"),variable.name="Individual",value.name="Status") 
head(m_data) 

#change status to ref, miss, or homo 
m_data$true_status <- gsub(".+=","",m_data$Status) 

#format strings based on status 
m_data$result <- with(m_data, ifelse(true_status=="miss",NA, 
            ifelse(true_status=="ref", 
              sprintf("%s%s",V2, V2), 
              ifelse(true_status=="homo", 
                sprintf("%s%s",V3,V3), 
                sprintf("%s%s", V2,V3))))) 

#turn back to wide 
res <- dcast(m_data, V1~Individual) 

#merge for V2 and V3 
res2 <- merge(data[,c("V1","V2","V3")],res,by="V1") 

> res2 
     V1 V2 V3 V4 V5 V6 V7 V8 
1 Chr10_247 T C <NA> TC TT TT TC 
2 Chr10_445 G T GG GG GT GG GT 
3 Chr10_447 A C CC CC CC CC CC 
4 Chr10_481 C T CC CT CT CC CT 
5 Chr10_517 G A AA GA GG AA GA 
6 Chr10_637 A G AG AA AG AG AG 
Смежные вопросы