2017-02-16 13 views
-2

正確には、1895971という名前のデータベースを、空白やNAsで整理して整理します。ループ機能を最適化してスピードアップする方法

そうすることで、私が動作するように思われるソリューションをコード化されました:

for(j in 1:length(final.cons.nom$N_COMPLETO.x)) { 

if((!is.na(final.cons.nom$N_COMPLETO.x[j]) & (final.cons.nom$N_COMPLETO.x[j] != "") & (final.cons.nom$N_COMPLETO.x[j] != " ") & length(strsplit(final.cons.nom$N_COMPLETO.x[j],' ')[[1]]) <= 3) & (length(strsplit(final.cons.nom$N_COMPLETO.x[j],' ')[[1]]) > 0)) { 

    if((is.na(final.cons.nom$NOMBRE.x[j]) | (final.cons.nom$NOMBRE.x[j] == "") | (final.cons.nom$NOMBRE.x[j] == " "))) { 
     final.cons.nom$NOMBRE.x[j] <- word(final.cons.nom$N_COMPLETO.x[j], 1)  
    } 

    if((is.na(final.cons.nom$PATERNO.x[j]) | (final.cons.nom$PATERNO.x[j] == "") | (final.cons.nom$PATERNO.x[j] == " "))) { 
     final.cons.nom$PATERNO.x[j] <- word(final.cons.nom$N_COMPLETO.x[j], 2)  
    } 

    if((is.na(final.cons.nom$MATERNO.x[j]) | (final.cons.nom$MATERNO.x[j] == "") | (final.cons.nom$MATERNO.x[j] == " "))) { 
     final.cons.nom$MATERNO.x[j] <- word(final.cons.nom$N_COMPLETO.x[j], 3)  
    } 

} 

} 

コードはフルネームN_COMPLETO.xとベクトルを見て最初の名前(NOMBRE.x)にその名前を破るしようとすると、姓(PATERNO.x)と姓(MATERNO.x)は、完全な名前が空白または空白でなくても3ワード以下であり、宛先ベクトルが有効なデータで占有されていない限り名前は適切に配布され、分離された)。

ループを10000回実行すると、約14秒かかります。そのため、ベクトル全体を45分以内に解析する必要があります(非常に粗い計算で)。

これらの45分で十分ですが、私はループを完了することなく(私はそれが進歩していることを知っているにもかかわらず)約2時間走っているRを残したことが分かります。

このような操作を高速化するための推奨事項はありますか?

ありがとうございます!

+1

ループのパフォーマンスを最適化する最適な方法は、完全にベクトル化されたコードを使用することです。 –

+0

これは私の最初の試み@JohnColemanでしたが、 'strsplit'は私としては動作しませんでした。代わりにその関数を調べます。ありがとう。 –

+0

また、関数 'word()'とは何ですか?これは基底Rの一部ではありません。 –

答えて

1

コード化されたバージョンに戻って、strsplitの使用方法を変更しました。

ベクトル化ソリューションかなり長いが、しかし、それはそのような技術を試みる人のための良い例となっている場合:

特に
final.cons.nom$NOMBRE.x[!is.na(final.cons.nom$N_COMPLETO.x) & 
(final.cons.nom$N_COMPLETO.x != "") & (final.cons.nom$N_COMPLETO.x != " ") & 
(sapply(strsplit(final.cons.nom$N_COMPLETO.x,' '), length) <= 3) & 
(sapply(strsplit(final.cons.nom$N_COMPLETO.x,' '), length) > 0) & 
(is.na(final.cons.nom$NOMBRE.x) | (final.cons.nom$NOMBRE.x == "") | 
(final.cons.nom$NOMBRE.x == " "))] <- 
word(final.cons.nom$N_COMPLETO.x[!is.na(final.cons.nom$N_COMPLETO.x) & 
(final.cons.nom$N_COMPLETO.x != "") & (final.cons.nom$N_COMPLETO.x != " ") & 
(sapply(strsplit(final.cons.nom$N_COMPLETO.x,' '), length) <= 3) & 
(sapply(strsplit(final.cons.nom$N_COMPLETO.x,' '), length) > 0) & 
(is.na(final.cons.nom$NOMBRE.x) | (final.cons.nom$NOMBRE.x == "") | 
(final.cons.nom$NOMBRE.x == " "))], 1) 

、私はとしてstrsplitの結果を使用することを指摘したいと思います論理評価用のベクトル:

sapply(strsplit(final.cons.nom$N_COMPLETO.x,' '), length) <= 3) 
+0

'word'関数は完全にベクトル化されています。 'is.na(word(final.cons.nom $ N_COMPLETO.x、4​​))'をテストして、フルネームが3ワード以下であるかどうかを調べることができます。 –

+0

素晴らしい!ありがとう、@ジョンコールマン。 –

関連する問題