【问题标题】:Speed up the analysis加速分析
【发布时间】:2011-05-02 10:47:09
【问题描述】:

我在 R 中有 2 个数据帧,例如 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")
)

我想检查 dfrefseq 中 df 女巫基因中的每个基因是否最接近所选的 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)), ]

谢谢!

【问题讨论】:

  • 请注意 df 是 R 中的一个函数。如果将来可能的话,我会尽量避免使用它。 dat 是使用恕我直言的好名字。与tablenames 相同。

标签: performance r dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以将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 和基因名来做到这一点。我使用plyr 包,但如果您更喜欢其中一个,我相信有基本的解决方案。也许其他人会加入基本解决方案。

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

    【讨论】:

    • 亲爱的蔡斯,非常感谢您的解决方案。他为我的数据集工作。唯一的问题是我的数据 zz 非常大。你知道是否可以只保存 sum_total_culomns 最低的结果。我想到了一些具有独特功能的东西。
    • @Lisann - 添加到我的回答中以解决您的其他问题。
    • 您可以将合并中的 all = TRUE 更改为 all.x = TRUE 并获得一些加速。
    猜你喜欢
    • 2016-04-24
    • 2013-04-29
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多