我有两个表: df.author 和 df.post ,它们通过一对多关系相关联。现在我更改了 df.author 的主键,我想要 df.post 来镜像更改。在以下R脚本中,我在match()
循环中使用while
来比较 df.post 的每一行的外键与 df的旧主键。作者和 - 当它们匹配时 - 用新的外键替换外键(形成 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
来压缩计算时间吗?
答案 0 :(得分: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)]
逻辑:只有匹配时才用现有值替换匹配值。