在不使用WHILE的情况下,一次比较两个向量一个值

时间:2013-09-30 00:20:13

标签: r while-loop plyr apply

我有两个表: 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来压缩计算时间吗?

1 个答案:

答案 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)]

逻辑:只有匹配时才用现有值替换匹配值。