A data.table
подход:
library(data.table)
setkey(setDT(DF1), Grade, Season, Score)
setkey(setDT(DF2), Grade, Season, Score)
DF3 <- DF2[DF1, roll = "nearest"]
В этом случае Score
из 263 фактически получит 2, так как это ближе к 264, чем к 261. Это будет согласовано с различными применяемыми сценариями.
Выход:
Grade Season Score Pctl ID Year
1: 6 Fall 259 1.0 A 2016
2: 6 Fall 263 2.0 C 2016
3: 6 Winter 269 6.5 D 2018
4: 7 Fall 264 9.0 B 2017
5: 8 Spring 277 3.0 E 2016
Однако вы также упоминаете 99-й процентиль.
Другое дело, что действительно могут быть оценки, которые находятся точно посередине между этими двумя значениями, как, например, Score
из 428 ниже, где другая таблица содержит только 427 и 429. В этом случае процентиль будет последовательно соответствовать нижнему.
Данные:
DF1
ID Year Grade Season Score
1: A 2016 6 Fall 259
2: B 2017 7 Fall 264
3: C 2016 6 Fall 263
4: D 2018 6 Winter 269
5: E 2016 8 Spring 277
6: F 2017 7 Spring 550
7: G 2015 6 Fall 428
DF2
Grade Season Score Pctl
1: 6 Fall 261 1.0
2: 6 Fall 264 2.0
3: 7 Fall 264 9.0
4: 8 Spring 267 5.0
5: 6 Winter 269 6.5
6: 8 Spring 277 3.0
7: 7 Spring 550 99.6
8: 6 Fall 427 84.0
9: 6 Fall 429 88.0
Добавление строки для 99-го процентиля:
library(data.table)
setkey(setDT(DF1), Grade, Season, Score)
setkey(setDT(DF2), Grade, Season, Score)
DF3 <- DF2[DF1, roll = "nearest"][Pctl > 99, Pctl := 99]
Как видите, Score
из 428 совпало с Score
из 427 в таблице присоединения, а 99,6 было заменено на 99:
DF3
Grade Season Score Pctl ID Year
1: 6 Fall 259 1.0 A 2016
2: 6 Fall 263 2.0 C 2016
3: 6 Fall 428 84.0 G 2015
4: 6 Winter 269 6.5 D 2018
5: 7 Fall 264 9.0 B 2017
6: 7 Spring 550 99.0 F 2017
7: 8 Spring 277 3.0 E 2016