R: join/merge of a table with two look-up tables based on a condition

R: join/merge of a table with two look-up tables based on a condition

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

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

和两个查找 tables:

scorefemale <- data.frame(age=c(18, 19, 20, 21, 22, 23), 
  score=c(1.1, 3.3, 5.5, 7.7, 9.9, 11.1))

> scorefemale
  age score
1  18   1.1
2  19   3.3
3  20   5.5
4  21   7.7
5  22   9.9
6  23  11.1

scoremale <- data.frame(age=c(18, 19, 20, 21, 22, 23), 
   score=c(2.2, 4.4, `6.6, 8.8, 10.1, 12.1))`

> scoremale
  age score
1  18   2.2
2  19   4.4
3  20   6.6
4  21   8.8
5  22  10.1
6  23  12.1

我基本上是想得到这个:

    gender  age score
1   Female  18  1.1
2   Male    18  2.2
3   Male    20  6.6
4   Female  21  7.7

我在条件 joins/merges 上查找的所有内容都假定一个主要 table 和一个参考 table,但我的问题需要两个参考 table。

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

更新:感谢 Gregor,最优雅的答案似乎只是从两个参考 rbind 中临时 table tables,然后使用两个 "by" 变量进行左连接:

everyoneexample <- merge(scores_FandM, everyoneexample, by=c("age", "gender"))
female_rows <- which(everyoneexample$gender == 'Female')
female_matches <- merge(everyoneexample[female_rows, ], scorefemale, by = 'age')

male_rows <- which(everyoneexample$gender == 'Male')
male_matches <- merge(everyoneexample[male_rows, ], scoremale, by = 'age')

everyoneexample$score <- NA
everyoneexample[female_rows, 'score'] <- female_matches$score
everyoneexample[male_rows, 'score'] <- male_matches$score

感谢@Gregor,他建议为每个 look-up table:

添加一个 gender
> scorefemale$gender <- "Female"
> scoremale$gender <- "Male"

然后将table组合成一个大的look-up table:

> scores_FandM <- rbind(scorefemale, scoremale)

最后 left-joining 主 table 和 look-up table 使用两个 "by" 变量 -- agegender -- 有效地将 复合键 组合成新的 look-up table:

> everyoneexample <- 
      merge(everyoneexample, scores_FandM, by=c('age', 'gender'), all.x = TRUE)

简洁大方...谢谢!