2016-11-03 2 views
1

最近、いくつかのRスクリプトを使ってレポートを作成しています。関連するタスクの1つは、列の値が別のデータフレームの行と一致するかどうかを確認することです。これが当てはまる場合は、新しい列を論理TRUE/FALSEに設定します。Rコードが信じられないほど遅い

は具体的には、私はこのコードのチャンクを改善する助けが必要:

for (i in 1:length(df1$Id)) { 
    df1 <- within(df1, newCol <- df1$Id %in% df2$Id) 
} 
df1$newCol <- as.factor(df1$newCol) 

それは何である、それを完全に実行するためにproc.time()でテスト(6分を必要としても意味がありませんので、データセットを約10Kの行を持っていますそれは私がそれを達成するための時間を食べている間違って何をやっている、現在起こっている。また、私はチェックのように他の種類を行う必要があるので、私は実際にこの権利を取得する必要があります。

をいただき、ありがとうございますあなたの助け!

+7

あなたのコードはベクトル化されています。 'for'ループは必要ありません。この場合、あなたは*あなたがループの中に 'i'を使用していないことを知ることができます*。あなたが10kの行を持っているなら、あなたは完全な操作を10k回実行しています。機能行 'df1 < - within(df1、newCol < - df1 $ Id%in%df2 $ Id)'の 'for'ラッパーを削除すると、〜10k倍のスピードアップが得られます。 – Gregor

+0

うわー、それはRで初心者のために得たものです:-)ありがとう!それは問題を解決し、理にかなった - 説明のおかげで! –

+1

@Gregor、投稿コメントとして回答...? –

答えて

9

コードはベクトル化されています。forループは必要ありません。この場合、のループの中にはiを使用していないので、あなたは知ることができます。これは、あなたのループがまったく同じ結果を正確に同じコードを10k回実行していることを意味します。機能ラインのラッパーを削除した場合

df1 <- within(df1, newCol <- df1$Id %in% df2$Id) 

あなたは〜10k倍のスピードアップが必要です。

もう1つのコメントは、データフレームの名前を内部で再入力しないようにすることです。だからdf1$の中にwithin()を使用してポイントを逃してしまっています。データフレーム名が短すぎるため、この場合はwithin()と入力するのが長くなります。あなたの全体のコードを1行に単純化することができます。

df1$newCol = factor(df1$Id %in% df2$Id) 

私の最後のコメント私はあなたのアプリケーションについて無知の状態から作るので、塩の粒とそれを取るが、バイナリ変数はほとんど常に進歩していますブール値(TRUE/FALSE)または整数(1/0)を因子として持つこと。それはあなたが何をしているかに依存しますが、私は必要な時までfactor()をオフにしておきます。

関連する問題