0

我有两个表:df.authordf.post,它们通过一对多关系相关联。现在我更改了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无法有效扩展大型数据集。我已经读过 using apply()(在我的情况下通过转换为矩阵)通常比 using 更好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 回答