2012-04-10 148 views
-5

我有以下数据:for循环再次

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正在为你做循环?

+7

什么是问题? (除了我以外,我看不到任何问号。) – OcuS 2012-04-10 19:08:35

+0

循环是循环,无论是FORTRAN还是Julia。但你说得对,'''操作员可以做很酷的事情。我可以推荐你阅读R-inferno,http://www.burns-stat.com/pages/Tutor/R_inferno.pdf? – 2012-04-10 19:14:43

+1

对于第二个问题,看看你的for循环。你*永远不会*使用变量我。这意味着你所做的全部工作是一次又一次地重新分配'x < - df2 [其中(df2 $ chrom%in%df1 $ chrom),]'' – 2012-04-10 19:23:47

回答

2

你可以更进一步:

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 
> 

这有帮助吗?每个注释

编辑:

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

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请勿...

+0

是的。我想我的查询变得更多(如何循环工作问题),而不是一个R问题。我为此道歉。但是,如果我想在没有使用()或%in%的情况下得到相同的答案会怎么样。只需使用for循环和i。我将如何实现这一目标?我知道R并不意味着以这种方式使用,而只是好奇? – user1079898 2012-04-10 21:33:14

+0

@ user1079898看我的编辑。但是不要这样做......它不开心...... – Justin 2012-04-10 22:00:19

+0

嗨,贾斯汀,对于迟到的回复感到抱歉......但是你保存了一天。非常感谢。我知道这不是做这件事的快乐方式,但我只是想知道它会如何工作。非常感谢! – user1079898 2012-04-13 06:40:56