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

R 在不使用WHILE的情况下一次比较一个值的两个向量,r,while-loop,plyr,apply,R,While Loop,Plyr,Apply,我有两个表:df.author和df.post,它们通过一对多关系进行关联。现在,我更改了df.author的主键,并希望df.post反映更改。在下面的R脚本中,我在while循环中使用match()将df.post的每一行的外键与df.author的旧主键进行比较,当它们匹配时,用新的外键替换外键(形成不同的df.author列)。请考虑以下事项: foreignkey <- c("old_pk1","old_pk2","old_pk3","old_pk4","old_pk5","ol

我有两个表:df.author和df.post,它们通过一对多关系进行关联。现在,我更改了df.author的主键,并希望df.post反映更改。在下面的R脚本中,我在
while
循环中使用
match()
将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)

foreignkey我认为这可能会以一种无环的方式完成所有事情:

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)]
df.post$foreignkey[

!length(匹配(df.post$foreignkey,df.author$primarykey_old))==0]拼写不正确:
as.Character
。如果这真的是一个有多种可能性的问题,那么您可以构建一个显示该特性的数据集。对不起,由于
stringsAsFactors=FALSE
第二个问题仍然没有解决。我怀疑这会使我给出的答案无效,但你现在有责任构建一个反例。如果我理解正确,只返回第一个匹配项。那么,如果在
df.post$foreignkey
中有重复的值,这里会发生什么呢?(这是一个从
df.post
df.author
的多对一关系)。我可以检查它是否确实有效,我只是不明白如何…我编辑了我的问题,添加了一个案例,在
foreignkey
中,
primarykey\u old
中没有值。使用此解决方案,
foreignkey
中的不匹配值将替换为空值。是否可以修改nomatch的
foreignkey
中的值?