r - 向量化包含循环和 if 子句的搜索函数

标签 r loops if-statement optimization vectorization

我得到了两个非常大的数据集,我一直在尝试构建一个函数,该函数可以从一个数据集中找到某些坐标,这些坐标尊重有关另一个数据集的 if 子句。 我的问题是我编写的函数非常慢,尽管我一直在以某种方式阅读类似问题的答案,但我还没有设法使其工作。
所以如果我得到:

>head(CTSS)    
    V1     V2     V3
1 chr1 564563 564598 
2 chr1 564620 564649
3 chr1 565369 565404
4 chr1 565463 565541
5 chr1 565653 565697
6 chr1 565861 565922

> head(href)
   chr      region    start      end strand nu   gene_id transcript_id
1 chr1 start_codon 67000042 67000044      +  . NM_032291     NM_032291
2 chr1         CDS 67000042 67000051      +  0 NM_032291     NM_032291
3 chr1        exon 66999825 67000051      +  . NM_032291     NM_032291
4 chr1         CDS 67091530 67091593      +  2 NM_032291     NM_032291
5 chr1        exon 67091530 67091593      +  . NM_032291     NM_032291
6 chr1         CDS 67098753 67098777      +  1 NM_032291     NM_032291

对于 href 数据集中开始列中的每个值,我想找到 CTSS 数据集第三列中较小的前两个值或等于它并将其保存在新的数据框中。
我写的循环:

y <- CTSS[order(-CTSS$V3), ]     
find_CTSS <- function(x, y) {
    n <- length(x$start)
    foo <- data.frame(matrix(0, n, 6))
    for (i in 1:n)
    {
        a <- which(y$V3 <= x$start[i])
        foo[i, ] = c(x$start[i], x$stop[i], y$V2[a[1]], y$V3[a[1]] , y$V2[a[2]], y$V3[a[2]])
    }

print(foo)

}

最佳答案

您提供的数据很少 ( but see here ),因此对您的解决方案进行基准测试有点困难。看看以下解决方案是否满足您的需求。

#make some fake data
href <- data.frame(start = runif(10), stop = runif(10), other_col = sample(letters, 10))
CTSS <- data.frame(col1 = runif(100), col2 = runif(100))

# for each row in href (but extract only stop and start columns)
result <- apply(X = href[, c("start", "stop")], MARGIN = 1, FUN = function(x, ctss) {
            criterion <- x["start"] #make a criterion
            #see which values are smaller or equal to this criterion (and sort them)
            extracted <- sort(ctss[ctss$col2 <= criterion, "col2"])
            #extract last and one to last value
            get.values <- extracted[c(length(extracted) - 1, length(extracted))] 
            #put values in data frame
            out <- as.data.frame(matrix(get.values, ncol = 2)) 
            return(out)
        }, ctss = CTSS)

#pancake a list into a data.frame
result <- do.call("rbind", result) 

关于r - 向量化包含循环和 if 子句的搜索函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7131277/

相关文章:

r - 使具有重复值的列在数据框中唯一

r - 大表处理(需要建议)

r - 在 stat_smooth 之上更改图例中 geom_point 的 alpha 级别

ruby - 在 Ruby 中匹配来自多个数组的相应对象索引值

objective-c - 代码行会导致仪器崩溃,但不会导致Xcode崩溃

python - 给定奇数或偶数条件,如何对列表中的偶数或奇数求和?

objective-c - 如何处理 if-than 语句中存在大量条件的情况?

r - 如何更改ggplot2中facet中面板之间间隙的宽度?

C# - foreach 循环 - 良好实践

c - 期待一份声明