私は別のテーブルに基づいてあるテーブルから値を取得する関数を実装しようとしています。実際のデータフレームは50,000を超える観測値を持つため、このネストされたforループの実装は効果的ではありません。私は過去数日間、それを見て、うまくいくものを見つけようとしましたが、できなかったものを探しました。私のデータは特別な順序ではありません(個人、セグメントなど)ので、物事が順不同であっても仕事ができる必要があります。ここでR - ネストされたループと遅いパフォーマンス
はで動作するように私のデータのおもちゃの例は以下のとおりです。
region_map <- data.frame(Start = c(721290, 1688193), End= c(1688192, 2926555))
individual <- c("Ind1","Ind2","Ind3","Ind4")
segment <- data.frame(SampleID = c("Ind1","Ind1","Ind2","Ind2","Ind3","Ind3","Ind4","Ind4","Ind4"),
Start = c(721290, 1688194, 721290, 1688200, 721290, 2926600, 721290, 1688193, 690),
End = c(1688192, 2926555,1688190, 2900000, 2926555, 3000000, 1500000, 2005000, 500000),
State = c(1,2,2,5,4,2,2,6,5))
そして、ここでは、私が何をしようとしているの簡単な例です:すなわち
Generate.FullSegmentList <- function(segments, individuals, regionmap){
FullSegments <- data.frame()
for(region in 1:nrow(regionmap)){
for(ind in individuals){
# If there is not a segment within that region for that individual
if(nrow(
segments[segments$start >= regionmap$Start[region] &
segments$End <= regionmap$End[region] &
segments$SampleID == ind , ]
) == 0){
Temp <- data.frame(SampleID = ind,
Start = regionmap$Start[region],
End = regionmap$End[region],
State = 3
)
}
# If there is a segment within that region for that individual
if(nrow(
segments[segments$Start >= regionmap$Start[region] &
segments$End <= regionmap$End[region] &
segments$SampleID == ind , ]
) == 1){
Temp <- data.frame(SampleID = segments$SampleID,
Start = regionmap$Start[region],
End = regionmap$End[region],
State = segments$State[segments$Start >= regionmap$Start[region] &
segments$SampleID == ind ]
)
}
FullSegments <- list(FullSegments, Temp)
}
}
FullSegments
}
、私が見てする必要があります各地域(約53,000)で値域(State
、存在しなければ3の値を与える)を各individual
の領域に割り当て、すべての個体ごとにすべての領域で新しいdata.frameを作成します。これを行うには、地域と重複していて、それをテーブルに追加するsegment
(これらは〜25,000件あります)がある地域と個人をループしています。ここで
SampleID Start End State
Ind1 721290 1688192 1
Ind1 1688193 2926555 2
Ind2 721290 1688192 2
Ind2 1688193 2926555 5
Ind3 721290 1688192 4
Ind3 1688193 2926555 4
Ind4 721290 1688192 2
Ind4 1688193 2926555 6
それが実行するのに非常に長い時間がかかりますことを除いて、私は、それを必要とする正確にどのような作品であるとして、この関数は、(使用して
system.time、私は実行するために3ヶ月以上かかるだろう)。私はこれを行うためのより良い方法がなければならないことを知っています。私はapply関数を実装しようとしましたが、data.frameの代わりにリストを使うためにいくつかの質問がありました。私はまた、これを単純化するためのdata.tableとplyrオプションがあることを知りました。私はこれらを試しましたが、ifステートメントでネストされたループで動作するようになっていませんでした。
私はこの複合体を何か書いたのはこれが初めてであるため、回答の説明をいただければ幸いです。私が関連していると思います
質問:
ループのネストされた上の他の多くの質問が適用機能(例えばapply(df, 1, function(x){ mean(x) }
)行うためによく働くやって計算を伴いますしかし、私はそれをdata.frameからdata.frameへの値のマッピングに採用することはできませんでした。
これは私のために働くもので、実際のデータを理解して修正することができます。私は染色体情報も持っていたので、私のデータにはGenomicRangesパッケージを使用しなければならなかった。すべてを理解するのにはしばらく時間がかかりましたが、非常に徹底的で役立つ説明に感謝します! –
ああ、私はsystem.timeを使ってこの時間を計りました:user:0.46、system:0.06、elapsed:0.51。かなり素晴らしい。 –
@GaiusAugustusあなたが生産的な一日を過ごしたように聞こえます。あなたの質問がBioconductor関連のものであれば、[Bioconductor support site](https://support.bioconductor.org)に投稿する方が良いでしょう –