【问题标题】:R: create vector from nested for loopR:从嵌套的for循环创建向量
【发布时间】:2011-12-15 00:00:38
【问题描述】:

我有一个矩阵中基因的“命中列表”。每一行都是一个命中,格式为“染色体(字符)开始(数字)停止(数字)”。我想看看这些命中中的哪些与苍蝇基因组中的基因重叠,这是一个格式为“染色体起始终止基因”的矩阵

我有以下功能(打印 dmelGenome 第 4 列的基因列表):

geneListBuild <- function(dmelGenome='', hitList='', binSize='', saveGeneList='')

{
genomeColumns <- c('chr', 'start', 'stop', 'gene')
genome <- read.table(dmelGenome, header=FALSE, col.names = genomeColumns)

chr <- genome[,1]
startAdjust <- genome[,2] - binSize
stopAdjust <- genome[,3] + binSize
gene <- genome[,4]

genome <- data.frame(chr, startAdjust, stopAdjust, gene)

hits <- read.table(hitList, header=TRUE)

chrHits <- hits[hits$chr == "chr3R",]
chrGenome <- genome[genome$chr == "chr3R",]

genes <- c()

for(i in 1:length(chrHits[,1])) 
{
    for(j in 1:length(chrGenome[,1]))   
    {
        if( chrHits[i,2] >= chrGenome[j,2]  &&  chrHits[i,3] <= chrGenome[j,3] )
        {
            print(chrGenome[j,4])
        }
    }
}

genes <- unique(genes[is.finite(genes)])

print(genes)

fileConn<-file(saveGeneList) 
write(genes, fileConn) 
close(fileConn) 

}

但是,当我将 print() 替换为:

genes[j] <- chrGenome[j,4]

R 返回一个向量,该向量具有 chrGenome[,1] 中存在的一些值。我不知道它是如何选择这些值的,因为它们不在似乎满足 if 语句的行中。我认为这是一个索引问题?

我也确信有一种更有效的方法可以做到这一点。我是 R 新手,所以我的代码效率不高。

这类似于“将嵌套循环的结果写入 R 中的另一个向量”,但我无法使用该线程中的信息修复它。

谢谢。

【问题讨论】:

  • 这是一大段我们无法重现的代码(没有示例数据),因此很难回答。请您 (1) 提供数据并 (2) 尝试更准确地定位问题的根源。
  • 这与一个绝对交叉发布到 r-help 和 BioC 列表的问题非常非常相似(让我怀疑用户#### 是否正在交叉点)。 BioConductor 对此类活动有很好的支持:stat.ethz.ch/pipermail/bioconductor/2011-October/041776.html

标签: r vector for-loop nested


【解决方案1】:

我相信内部循环可以替换为:

gene.in <- ifelse( chrHits[i,2] >= chrGenome[,2] &  chrHits[i,3] <= chrGenome[,3], 
    TRUE, FALSE)

然后您可以使用该逻辑向量来选择您想要的内容。正在做

which(gene.in)

也可能对你有用。

【讨论】:

  • 甚至gene.in &lt;- chrHits[i,2] &gt;= chrGenome[,2] &amp; chrHits[i,3] &lt;= chrGenome[,3]
  • 谢谢 - 我尝试了 Richie 对 Patrick 建议的修改,但它只返回一个值,而且我知道有多个命中,因为我在使用 print() 时可以看到它们。我现在时间紧迫,只是将打印的列表复制到 txt 文件中。我不是在交叉发布,但感谢您将我指向生物导体线程!我会检查一下。 Richie - 如果我删除“print(chrGenome[j,4])”并尝试将输出发送到对象,则会出现问题。我认为我的索引不正确。
猜你喜欢
  • 2021-12-08
  • 2020-01-29
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
相关资源
最近更新 更多