Объединить по 3 значениям (два указано, одно в диапазоне) - PullRequest
0 голосов
/ 02 ноября 2018

Извините за полуконвертированный заголовок. Надеюсь, я смогу продемонстрировать, к чему я клоню. У меня есть следующие фреймы данных (упрощенные по сравнению с моими реальными данными):

DF1 
ID  Year    Grade   Season  Score
A   2016      6     Fall     259
B   2017      7     Fall     264
C   2016      6     Fall     263
D   2018      6     Winter   269
E   2016      8     Spring   277

DF2
Grade   Season  Score   Pctl
 6       Fall    261    1
 6       Fall    264    2
 7       Fall    264    9
 8      Spring   267    5
 6      Winter   269    6.5
 8      Spring   277    3

И я хочу получить:

DF3
ID  Year    Grade   Season  Score   Pctl
A   2016    6        Fall    259     1
B   2017    7        Fall    264     9
C   2016    6        Fall    263     1
D   2018    6        Winter  269     6.5
E   2016    8        Spring  277     3

Проще говоря, учитывая сезон, оценку и счет в DF1, я хочу добавить соответствующий Pctl из DF2. Я понимаю, что в большинстве случаев это так же просто, как использование merge() и предоставление заданных аргументов "by".

Однако, хотя сезон и класс объединяются плавно, поскольку имеют точные значения, которым они соответствуют, это не всегда относится к баллам.

Сначала возьмем, к примеру, идентификатор «А». Их оценка 259, что ниже Grade:6, Season:Fall и Score:261. В этом случае я хочу, чтобы pctl был присвоен как 1. Точно так же, когда результат выше 99 pctl (здесь не показано), он должен быть присвоен как 99.

Второе осложнение демонстрируется идентификатором "C", где их Score:263 находится между Pctl 1 и 2. То есть это не отображение 1: 1. Когда это происходит, я просто хочу округлить (вверх или вниз, если это соответствует) до ближайшего результата и указать Pctl. Для этой демонстрации я округлил и добавил Pctl 1.

Из моего исследования кажется, что это можно сделать с помощью условного соединения или пакета GenomicRanges, но решения для меня были неясны.

1 Ответ

0 голосов
/ 02 ноября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...