0

1 対多の関係で関連付けられているdf.authordf.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か?

4

1 に答える 1

1

これはループレスな方法ですべてを行うかもしれないと思います:

df.post$foreignkey[
    !length(match(df.post$foreignkey, df.author$primarykey_old))==0] <- # the test
    df.author$primarykey_new[match(df.post$foreignkey, df.author$primarykey_old)]

ロジック : 一致する場合のみ、既存の値を一致する値に置き換えます。

于 2013-09-30T00:43:49.093 に答える