【发布时间】:2014-01-31 03:57:14
【问题描述】:
我正在尝试获取一个向量,告诉我 data.frame (transcriptcoords) 中有哪些行
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
在另一个 data.frame (genecoords) 中松散地包含开始/结束坐标(公差为 +/- 10)
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
为此,我在第一个 data.frame 的行索引上循环使用 sapply,将坐标与第二个 data.frame 中的任何行匹配。我有一个解决方案(如下所述),但它似乎相当慢(大约 6 秒,有 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)
}
))
【问题讨论】: