2016-07-17 3 views
1

私は150万行の中規模の要素を持っています。データは、(15.500593489554, -98.593930203954)という形式の座標です。Rでこの正規表現をどのように高速化できますか?

各座標を抽出し、数値に変換して、別々の列に入れたいとします。問題は、私が書いたコードが、すべての私のラム(8 GB)、Rのクラッシュ、そして私のコンピュータのロックアップを長く食べるということです。 Rを再起動しても99%の物理メモリ使用率を維持します。ここ

私はちょうど最初の因子から座標を抽出するために使用されるコードである:これは働いていなかったので

library(stringr) 
sapply(dat, function(x) as.numeric(str_match(x, "([.0-9]+),")[,2])) 

、Iは、データ・セットのサブセットを決定し、100行でコマンドを実行していることが見出さ数秒かかります。 1000行には約25秒かかります。だから私は、データを分割して別々に処理し、それを一緒に戻しても何時間もかかるでしょう。

この問題を解決する方法はありますか?私はベースR(grep()gsub()など)で私の正規表現コマンドを使用する方法を理解できませんでした。 str_match()はちょうど遅いですか?

dat <- factor(replicate(1500000, paste("(", runif(1, 0, 150), ", ", runif(1, -150, 0), ")", sep = ""))) 

と参照用

が、ここでは第二の対の座標抽出するための私の正規表現である:ここで

は模倣私のデータの構造サンプルデータセットです

as.numeric(str_match(x, "([-.0-9]+)\\)")[,2])) 
+3

ベクトル化を理解する必要があります。これらのすべてのループがあなたを殺しています。たとえば、 'runif'がベクトル化されているため、' dat'を作成するときに 'replicate'を使用する理由はありません。 – Roland

答えて

4

スプリットデータをコンマで区切り、最初と最後の文字を削除します。

splits = strsplit(as.character(substr(dat,2,nchar(as.character(dat))-1)),",") 

数値行列:私のラップトップ上の10万長datベクター上

> xy = matrix(as.numeric(do.call(rbind,splits)),ncol=2) 
> dat[1:10] 
[1] (86.1234028358012, -6.26554019981995) (141.88499195734, -28.9505033288151) 
[3] (48.9979103207588, -85.1732837269083) (22.5762162473984, -3.01207801094279) 
[5] (81.2530122930184, -26.4870180166326) (71.918728435412, -86.2695457180962) 
[7] (1.14843629999086, -25.0385148217902) (90.2961491374299, -55.1420112024061) 
[9] (7.83875549677759, -58.2294602994807) (108.123476186302, -10.3448686539195) 
1000 Levels: (0.0320718856528401, -10.3856220259331) ... 
> head(xy) 
      [,1]  [,2] 
[1,] 86.12340 -6.265540 
[2,] 141.88499 -28.950503 
[3,] 48.99791 -85.173284 
[4,] 22.57622 -3.012078 
[5,] 81.25301 -26.487018 
[6,] 71.91873 -86.269546 

実際に瞬間。

+0

'fixed = TRUE'を設定する必要があります。 – Roland

+0

は、スプリットフェーズを0.32秒から0.14秒にスピードアップします - マトリックス構築フェーズは0.08秒かかります – Spacedman

関連する問題