Ускорить анализ - PullRequest
       29

Ускорить анализ

1 голос
/ 02 мая 2011

У меня есть 2 кадра данных в R, например, df и dfrefseq.

df<-data.frame( chr =  c("chr1","chr1","chr1","chr4")
    , start = c(843294,4329248,4329423,4932234)
    , stop = c(845294,4329248,4529423,4935234)
    , genenames= c("HTA","OdX","FEA","MGA")
)
dfrefseq<-data.frame( chr =  c("chr1","chr1","chr1","chr2")
    , start = c(843294,4329248,4329423,4932234)
    , stop = c(845294,4329248,4529423,4935234)
    , genenames= c("tra","FGE","FFs","FAA")
)

Я хочу проверить для каждого гена в гене df ведьма в dfrefseq находится ближе всего к выбранному гену df.Сначала я выбрал «chr1» в обоих таймфреймах.Затем я вычислил для первого гена в readschr1 расстояние между сайтами start-start, start-stop, stop-start и stop-stop.Сумма этих расчетов говорит все о расстоянии.Мой вопрос здесь, как я могу ускорить этот анализ?Потому что теперь я проверил только 1 ген с данным кадром, но мне нужно протестировать 2000 генов.

readschr1 <- subset(df,df[,1]=="chr1") 
refseqchr1 <- subset(dfrefseq,dfrefseq[,1]=="chr1") 

names<-list()
read_start_start<-list()
read_start_stop<-list() 
read_stop_start<-list()
read_stop_stop<-list()

for (i in 1:nrow(refseqchr1)) {
startstart<-abs(readschr1[1,2] - refseqchr1[i,2])
startstop<-abs(readschr1[1,2] - refseqchr1[i,3])
stopstart<-abs(readschr1[1,3] - refseqchr1[i,2])
stopstop<-abs(readschr1[1,3] - refseqchr1[i,3])
read_start_start[[i]]<- matrix(startstart)
read_start_stop[[i]]<- matrix(startstop)
read_stop_start[[i]]<- matrix(stopstart)
read_stop_stop[[i]]<- matrix(stopstop)
names[[i]]<-matrix(refseqchr1[i,4])
}
table<-cbind(names, read_start_start, read_start_stop, read_stop_start, read_stop_stop)


sumtotalcolumns<-as.numeric(table[,2]) + as.numeric(table[,3])+ as.numeric(table[,4]) + as.numeric(table[,5])
test<-cbind(table, sumtotalcolumns)
test1<-test[order(as.vector(test$sumtotalcolumns)), ]

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 мая 2011

Пакет Bioconductor GenomicRanges предназначен для работы с данным типом

source('http://bioconductor.org/biocLite.R')
biocLite('GenomicRanges')                      # one-time installation

тогда

library(GenomicRanges)
gr <- with(df,
           GRanges(factor(chr, levels=paste("chr", 1:4, sep="")),
                   IRanges(start, stop), genenames=genenames))
grrefseq <- with(dfrefseq,
                 GRanges(factor(chr, levels=paste("chr", 1:4, sep="")),
                         IRanges(start, stop), genenames=genenames))

и

> nearest(gr, grrefseq)
[1]  1  2  3 NA
1 голос
/ 02 мая 2011

Вы можете merge два отдельных data.frames вместе, чтобы сформировать одну таблицу, а затем использовать векторизованные операции. Ключом к merge является указание общего столбца (столбцов) между data.frames и указание ему, что делать, если есть случаи, которые не совпадают. Указание all = TRUE вернет все строки и заполнит NA, если в другом data.frame, то есть ch2 и ch4, в этом случае нет совпадения. После объединения data.frames это простое упражнение: вычитать разные столбцы из друг друга и затем суммировать четыре интересующих столбца. Я использую transform, чтобы сократить объем, необходимый для вычитания.

zz <- merge(df, dfrefseq, by = "chr", all = TRUE)

zz <- transform(zz, 
    read_start_start = abs(start.x - start.y)
  , read_start_stop = abs(start.x - stop.y)
  , read_stop_start = abs(stop.x - start.y)
  , read_stop_stop = abs(stop.x - stop.y)
)

zz <- transform(zz,
  sum_total_columns = read_start_start + read_start_stop + read_stop_start + read_stop_stop
  )

Вот один подход - получить строку с минимальным расстоянием. Я предполагаю, что вы хотите сделать это chr и genenames. Я использую пакет plyr, но я уверен, что есть базовые решения, если вы предпочитаете один из них. Может быть, кто-то еще будет вмешиваться в базовое решение.

require(plyr)
ddply(zz, c("chr", "genenames.x"), function(x) x[which.min(x$sum_total_columns) ,])
...