【问题标题】:The for loop again再次for循环
【发布时间】:2012-04-10 19:02:43
【问题描述】:

我有以下数据:

df1 <- data.frame(chrom=c("chr1","chr2","chr5"),
    start=c(10,20,30), end=c(100,200,300), stringsAsFactors=FALSE)

df2 <- data.frame(chrom=c("chr1","chr4","chr2","chr1"),
    start=c(15,500,150,200), end=c(75,1000,300,300), stringsAsFactors=FALSE)

我想做以下事情:

for(i in 1:nrow(df2)) {
    # only if this condition is true (i.e. if there is overlap)
    if((df1$start <= df2$start && df1$end >= df2$start) ||
       (df1$start >= df2$start && df1$start <= df2$end)) {
        x <- df2[which(df2$chrom %in% df1$chrom),]
    }
}

答案应该是:

df3 <- data.frame(chrom=c("chr1", "chr2"), start=c(15,150),
    end=c(75,300), stringsAsFactors=FALSE)

抱歉给大家带来了困惑。

人们对我的查询非常有耐心,这是一次非常有帮助和学习的经历。但是我试图了解循环是如何工作的,我越想越困惑。例如:

for(i in 1:nrow(df2)) {
    x <- df2[which(df2$chrom %in% df1$chrom),]
}

完全一样:

x <- df2[which(df2$chrom %in% df1$chrom),]

所以你甚至不需要循环。这怎么可能?我猜which 正在为你做循环?

【问题讨论】:

  • 问题是什么? (除了我的,我看不到任何问号。)
  • 循环就是循环,无论是 FORTRAN 还是 Julia。但你是对的,[ 运算符可以做非常酷的事情。我可以推荐你阅读 R-inferno,burns-stat.com/pages/Tutor/R_inferno.pdf 吗?
  • 对于您的第二个问题,请查看您的 for 循环。你从不使用变量 i。这意味着您所做的只是一次又一次地重新分配x &lt;- df2[which(df2$chrom %in% df1$chrom),](所以它的作用当然与分配一次相同)
  • 我明白了。我从不使用 i 所以它甚至无法识别 for 循环。它只计算 x
  • 我们已经在这个问题stackoverflow.com/questions/10083653/the-for-loop-aahh 中介绍了这个基础。你似乎没有把你在那里获得的东西应用到这里。我不明白这个问题与此有何不同;因为贾斯汀在这里的回答与我之前回答的问题基本相同。我相信这是一个重复的问题,因此投了反对票。

标签: r


【解决方案1】:

你可以走得更远:

df2[df2$chrom %in% df1$chrom,]

由于 R 是“矢量化”的,因此您从 df2 返回符合您给定条件的行。把它分成两部分:

> df2$chrom %in% df1$chrom  
[1] TRUE FALSE  TRUE  TRUE

也就是说第 1、3 和 4 行满足这个条件。然后我们使用该布尔向量对df2 进行子集化。 R 只会返回你告诉它是TRUE 的行。

> df2[c(TRUE, FALSE, TRUE, TRUE),]
  chrom start end
1  chr1    15  75
3  chr2   150 300
4  chr1   200 300
> 

这有帮助吗?

根据评论编辑:

非常非 R 的方式将嵌套 for 循环...

output <- data.frame()
for(i in 1:nrow(df2)) {
  foo <- NULL
  for(j in 1:nrow(df1)) {
    if(df1$chrom[j]==df2$chrom[i]) {
      foo <- df2[i,]
    }
  }
  output <- rbind(output, foo)
}

但是,这正是在 R 中不应该做的事情......

【讨论】:

  • 是的。我想我的查询更多的是(循环如何工作的问题)而不是 R 问题。我为此道歉。但是,如果我想在没有 which() 或 %in% 的情况下得到相同的答案怎么办。只需使用 for 循环和 i.我将如何做到这一点?我知道 R 不应该以这种方式使用,只是好奇?
  • 嗨,贾斯汀,很抱歉回复晚了....但是您挽救了这一天。非常感谢。我知道这不是快乐的方式,但我只是想知道它是如何工作的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多