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" 变量 -- age 和 gender -- 有效地将 复合键 组合成新的 look-up table:
> everyoneexample <-
merge(everyoneexample, scores_FandM, by=c('age', 'gender'), all.x = TRUE)
简洁大方...谢谢!
我有一个人的基本数据集:
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" 变量 -- age 和 gender -- 有效地将 复合键 组合成新的 look-up table:
> everyoneexample <-
merge(everyoneexample, scores_FandM, by=c('age', 'gender'), all.x = TRUE)
简洁大方...谢谢!