2012-04-10 9 views
-5

私は、次のデータがあります。ザ・ループのため再び

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) 
すべての混乱のために申し訳ありません

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) 

を私は次の操作を行いたいです。

人は私の質問にとても忍耐強く、非常に有益で学習経験があります。しかし、私はループの仕組みが理解できるようにしようとしています。たとえば:

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

だから、あなたも、ループを必要としない:

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

はとまったく同じこと。これはどのように可能ですか?私はwhichがあなたのためにルーピングをやっていると思いますか?

+7

質問とは何ですか? (私以外の疑問符は見えません) – OcuS

+0

ループはループであり、FORTRANでもJuliaでも構いません。しかし、オペレータが非常にクールなことをすることができます。 R-インフェルノ、http://www.burns-stat.com/pages/Tutor/R_inferno.pdfを読むことをお勧めしますか? –

+1

2番目の質問では、forループを見てください。あなたは決して変数iを使うことはありません。つまり、何回も 'x < - df2 [(df2 $ chrom%の%df1 $ chromで)、]'を再割り当てするということです(もちろん、これは一度だけ割り当てたのと同じことです) –

答えて

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 
> 

これは役に立ちますか?

コメントあたりEDIT:

非常に非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の質問ではなく、(ループがどのように動作するか)より多くなってきたと思います。私はそれをお詫び申し上げます。しかし、もし私が(または)%でない同じ答えを得たいのであればどうでしょうか? forループとiを使うだけです。どうすればそれを達成できますか?私はRがこのように使用されるのではなく、好奇心が強いことを知っていますか? – user1079898

+0

@ user1079898私の編集を参照してください。しかし、これをしないでください...その幸せではありません... – Justin

+0

こんにちはジャスティン、遅く返事を申し訳ありません....しかし、あなたは日を救った。ありがとうございます。私はそれをやっている幸せな方法ではないことを知っていますが、私はそれがどのように機能するのか知りたかっただけです。どうもありがとうございます! – user1079898

関連する問題