2016-12-21 5 views
0

ヒストンの位置を示す関連する染色体位置のリストに対応する染色体/位置データフレームから領域を抽出しようとしています。私の現在の「パイプライン」:対応するリストで複数のデータフレームをサブセット化する際の問題

インポート元のデータセットの染色体位置を含む:

> mapinfo<- read.table() 
> colnames(mapinfo)<-c("CHR","M") 
> mapinfo$CHR<- paste("chr",mapinfo$CHR),sep="") 
> head(mapinfo) 
CHR   M 
1 chrX 24072640 
2 chr9 131463936 
3 chr14 105176736 
4 chr13 115000168 
5 chr8 74791285 
6 chr19 3676340 

インポートベッドファイルを含むヒストン位置

をMapInfoのデータフレームからサブセットに使用するための染色体特異的コードを生成
> bed<-read.table() 
> names(bed)<- c("Chr","Start","Stop") 
> head(bed) 
Chr  Start  Stop 
1 chr4 76806896 76807598 
2 chrY 10034763 10036639 
3 chr2 133036421 133037716 
4 chr21 27227897 27228500 
5 chr1 145036931 145041607 
6 chr2 91777964 91779762 

> Mcodes<- by(bed,bed$Chr,function(x){paste("M>=",bed$Start,"&M<=",bed$Stop,sep="",collapse="|")}) 
> Mcodes[chr1] 
chr1 
"M>=130786932&M<=130787255|M>=133156512&M<=133156894..." 

サブセットオリジナルmapinfo da私は、染色体によって個々に自分の所望の領域をサブセットするために、以下の行を使用することができます。この時点で

> subs<- split(mapinfo,mapinfo$CHR) 

:染色体によってtaset

> CHR1<- eval(parse(text=paste0('subset(subs$chr1,',Mcodes["chr1"],')'))) 

私は中に含まれるすべての染色体の特定のデータフレームをサブセットしたいと思います"最終的に同じパイプラインに置く必要がある様々なヒストン/ヒストン変種のための複数のベッドファイルを持っているので、コードの24の最後の行を実行することなく、" Mcodes "の染色体特異的対応リストによって" subs " 。それを可能にするためにループ/適用/何かする方法はありますか?

申し訳ありませんが、些細な疑問が残っていると思われる場合は、まだR /プログラミングゲームの新機能です。 アドバイスありがとうございます。ここで

をおもちゃmapinfoです:

答えて

1

は、ここで私が正しくあなたを理解している場合、助けるべきである、というおもちゃの例です

mapinfo <- data.frame(
    CHR = paste0("chr", rep(1:3, each = 3)), 
    M = c(1, 10, 100) 
) 
mapinfo 
#> CHR M 
#> 1 chr1 1 
#> 2 chr1 10 
#> 3 chr1 100 
#> 4 chr2 1 
#> 5 chr2 10 
#> 6 chr2 100 
#> 7 chr3 1 
#> 8 chr3 10 
#> 9 chr3 100 

おもちゃbed:次に

bed <- data.frame(
    CHR = paste0("chr", rep(1:3, each = 2)), 
    Start = c(0, 5, 15), 
    Stop = c(5, 15, 120) 
) 
bed 
#> CHR Start Stop 
#> 1 chr1  0 5 
#> 2 chr1  5 15 
#> 3 chr2 15 120 
#> 4 chr2  0 5 
#> 5 chr3  5 15 
#> 6 chr3 15 120 

、それらがない場合はdplyrpurrrinstall.packages(c("dplyr", "purrr"))を使用してパッケージをインストールし、以下を実行してください:

library(dplyr) 
library(purrr) 

mapinfo %>% 
    left_join(bed) %>% 
    filter(pmap_lgl(list(M, Start, Stop), between)) 
#> CHR M Start Stop 
#> 1 chr1 1  0 5 
#> 2 chr1 10  5 15 
#> 3 chr2 1  0 5 
#> 4 chr2 100 15 120 
#> 5 chr3 10  5 15 
#> 6 chr3 100 15 120 

これはbedで指定StartStop数値の間であったmapinfoのすべての要素のデータフレームです。この時点で、あなたが先に行くと、必要に応じて、それを分割し、StartStop列を削除、などができ

重要な注意:CHR両方データフレーム(例えば、すべて大文字)で正確に同じラベルを持っている必要があります。私はあなたが1つにすべての帽子を、別の帽子には最初の文字の帽子だけを持っていたことに気づいた。ここでは、(a)このコードが機能するように、(b)一貫性があるため、コードを簡単に消化することができます。ここ

あなたがコードのあなたの理解を開発するためには、ギャレットGrolemundとハドレーウィッカムによる "データサイエンスのためのR" にいくつかの関連リンクです:

+0

"開始"と " left_join(mapinfo、bed)に続いて「停止」します。あなたのおもちゃの例とは異なり、私のデータセットには、ベッドファイル内のその染色体の開始/停止領域に入る染色体の複数の「M」ポジションが含まれています。または、私はまだ完全に結合関数を理解していないかもしれません。 –

+0

私の例では、このようなオーバーラップを取ろうとしました。私が考えることができるベスト - 'CHR'のすべての値に一致するものがあることを確認してください。たとえば、「chr1」、「chr2」、...は両方のデータフレームに現れます(これらは大文字と小文字が区別されます)。その場合、それらが文字か要素かをチェックします( 'class(mapinfo $ CHR)')。 –

+0

運がありません。私はまだこの場合に参加することに根本的な問題があると思っています。あなたが "|"ベッドで指定された条件に基づいてmapinfoをサブセット化するとき。そうしなければ、行をたどることしかできず、他の行に含まれている値に基づいてフィルタリングすることはできません。あなたの例には、ベッドファイルの特異領域に入るMの複数の値は含まれていません。 –

関連する問題