R:基于条件将一个表与两个查找表连接/合并

R:基于条件将一个表与两个查找表连接/合并,r,join,merge,conditional,R,Join,Merge,Conditional,我有一个基本的人员数据集: everyoneexample <- data.frame( gender=c("Female", "Male", "Male", "Female"), age=c(18, 18, 20, 21)) > everyoneexample gender age 1 Female 18 2 Male 18 3 Male 20 4 Female 21 我在条件联接/合并上查找的所有内容都假定一个主表和一个引用表,但我的问题需要两个引用表 希

我有一个基本的人员数据集:

everyoneexample <- data.frame(
gender=c("Female", "Male", "Male", "Female"), age=c(18, 18, 20, 21))

> everyoneexample
  gender age
1 Female  18
2   Male  18
3   Male  20
4 Female  21
我在条件联接/合并上查找的所有内容都假定一个主表和一个引用表,但我的问题需要两个引用表

希望这个例子是清楚的,但如果你想让我澄清什么,请不要问任何问题

更新:多亏了Gregor,最优雅的答案似乎只是用两个引用表的rbind创建一个临时表,然后使用两个by变量进行左连接:

everyoneexample <- merge(scores_FandM, everyoneexample, by=c("age", "gender"))

多亏了@Gregor,他建议在每个查找表中添加一个性别列:

> scorefemale$gender <- "Female"
> scoremale$gender <- "Male"
> scores_FandM <- rbind(scorefemale, scoremale)
> everyoneexample <- 
      merge(everyoneexample, scores_FandM, by=c('age', 'gender'), all.x = TRUE)
然后将这些表组合成一个大型查找表:

> scorefemale$gender <- "Female"
> scoremale$gender <- "Male"
> scores_FandM <- rbind(scorefemale, scoremale)
> everyoneexample <- 
      merge(everyoneexample, scores_FandM, by=c('age', 'gender'), all.x = TRUE)
最后,使用两个by变量(年龄和性别)将主表与查找表连接起来,有效地将一个复合键组成新的组合查找表:

> scorefemale$gender <- "Female"
> scoremale$gender <- "Male"
> scores_FandM <- rbind(scorefemale, scoremale)
> everyoneexample <- 
      merge(everyoneexample, scores_FandM, by=c('age', 'gender'), all.x = TRUE)

简单而优雅。。。谢谢大家!

a向每个查找表添加一个性别列并使用两个左联接,或b按性别拆分主表并将每个拆分连接到相应的查找,然后重新组合。我推荐a。多亏了Gregor,我首先尝试了这个解决方案,因为它看起来干净而优雅,但是我意识到,在尝试第二次合并时,我的数据集将生成单独的score.x和score.y列,所以我求助于Nathan的解决方案。我确信有一个简单的参数可以解决这个问题,但是内森的答案已经可用了,而不是试图找到它。。。但是谢谢你!最后,我确实使用了你的解决方案。为了协调两次连接后形成的多个分数列,我必须做一个df$score。可能会节省一些麻烦的轻微调整是:1向每个查找表中添加性别列,2将查找表合并,3将主数据合并。这意味着您只需要一个连接。谢谢Gregor,这是最优雅的回答。我刚刚在我的真实数据集上尝试了您的建议。我没有想到的一件事是,我的实际数据表中有age==NAs,我必须将age==NA行添加到我的引用表中,但除此之外,一切都很好。非常感谢。深入研究数据,我发现它实际上并不正确。在只跑了女性部分后,我跑了一个大的dcast每个人都有一个例子,年龄~分数。。。在主数据集上,虽然查找数据的性质对每个年龄都有唯一的分数,但我看到了每个分数对大多数年龄的分布。1/22/2另外,查看主数据集,每个分数以块的形式显示,例如,女性查找表中的第一个分数年龄=15,与everyoneexample中的前四个女性行相对应,而与年龄无关。然后,everyoneexample中接下来100个左右的女性行在女性查找表age=16中获得下一个分数,而与everyoneexample表中的年龄无关。