1 対多の関係で関連付けられているdf.authorとdf.postの2 つのテーブルがあります。df.authorの主キーを変更したので、 df.postに変更を反映させたいと思います。次の R スクリプトmatch()
では、while
ループで使用して df.post の各行の外部キーをdf.authorの古い主キーと比較し、それらが一致すると、外部キーを新しいキーに置き換えます (別の列を形成します)。df.authorの)。次の点を考慮してください。
foreignkey <- c("old_pk1","old_pk2","old_pk3","old_pk4","old_pk5","old_pk1","old_pk7")
df.post <- data.frame(foreignkey,stringsAsFactors=FALSE)
rm(foreignkey)
primarykey_old <- c("old_pk1","old_pk2","old_pk3","old_pk4","old_pk5")
primarykey_new <- c("new_pk1","new_pk2","new_pk3","new_pk4","new_pk5")
df.author <- data.frame(primarykey_old, primarykey_new, stringsAsFactors=FALSE);
rm(primarykey_old); rm(primarykey_new)
i <- 1; N <- length(df.post$foreignkey)
while (i <= N) {
match <- match(df.post$foreignkey[i], df.author$primarykey_old)
if (!is.na(match)) {
df.post$foreignkey[i] <- df.author$primarykey_new[match]
}
i <- i + 1
}
rm(N); rm(i); rm(match)
スクリプトは機能しますがwhile
、大規模なデータセットに対して効率的にスケーリングされないためです。apply()
通常、 を使用するよりも (私の場合は行列に変換して) を使用する方が優れていると読みましたwhile
。私の場合も当てはまるのではないでしょうか。ループを見ると、データフレームのすべての行を調べて外部キーを取得し、次に df.author を取得する必要があることがわかりますmatch()
。を使用しないことで計算時間を圧縮できますwhile
か?