我有两个表:df.author和df.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
吗?