Я пытаюсь получить вектор рассказывал мне, какие строки в data.frame (transcriptcoords)Эффективная скоординировать матч между data.frames в R с sapply
chr start end
NONHSAT000001 chr1 11868 14409
NONHSAT000002 chr1 11871 14412
NONHSAT000003 chr1 11873 14409
NONHSAT000004 chr1 12009 13670
NONHSAT000005 chr1 14777 16668
NONHSAT000006 chr1 15602 29370
имеют начало/конец координат свободно содержащийся (с 10 +/- о толерантности) в другом data.frame (genecoords)
chr start end
NONHSAG000001 chr1 11869 14412
NONHSAG000002 chr1 14778 29370
NONHSAG000003 chr1 29554 31109
NONHSAG000004 chr1 34554 36081
NONHSAG000005 chr1 36273 50281
NONHSAG000006 chr1 62948 63887
Чтобы сделать это, я зацикливание с sapply над рядами индексов первого data.frame, соответствующие координаты с любой строки в второй data.frame. У меня есть решение (как описано ниже), но это, кажется, довольно медленно (около шести секунд с ломтиком 2000 строк):
user system elapsed
6.02 0.00 6.04
Я пытаюсь понять, какие части sapply могут быть оптимизированы. Это блок if/else? Или сравнения строк (==, < =,> =)? Или, проще говоря, является ли он внутренне медленным алгоритмом?
Спасибо! Код я сгенерировал ниже:
load(url("http://www.giorgilab.org/stuff/data.rda"))
# Pre-vectorize the data frames
g0<-rownames(genecoords)
g1<-genecoords[,1]
g2<-as.integer(genecoords[,2])
g3<-as.integer(genecoords[,3])
t0<-rownames(transcriptcoords)
t1<-transcriptcoords[,1]
t2<-as.integer(transcriptcoords[,2])
t3<-as.integer(transcriptcoords[,3])
system.time(gs<-sapply(1:2000,function(i){
t<-t0[i]
chr<-t1[i]
start<-t2[i]
end<-t3[i]
# Find a match (loose boundaries +/- 10)
right1<-which(g1==chr)
right2<-which(g2<=start+10)
right3<-which(g3>=end-10)
right<-intersect(right3,intersect(right1,right2))
right<-g0[right]
if(length(right)==1){
g<-right
} else if(length(right)>1){
# Get the smallest match
heregenecoords<-genecoords[right,]
size<-apply(heregenecoords,1,function(x){abs(as.numeric(x[3])-as.numeric(x[2]))})
g<-names(which.min(size))
} else {
g<-t
}
return(g)
}
))