2012-04-10 146 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