正確には、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を残したことが分かります。
このような操作を高速化するための推奨事項はありますか?
ありがとうございます!
ループのパフォーマンスを最適化する最適な方法は、完全にベクトル化されたコードを使用することです。 –
これは私の最初の試み@JohnColemanでしたが、 'strsplit'は私としては動作しませんでした。代わりにその関数を調べます。ありがとう。 –
また、関数 'word()'とは何ですか?これは基底Rの一部ではありません。 –