использование функции "setkey" для объединения таблицы с общими значениями в R - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть две структуры одной таблицы:

id_station day Precipitaion id_station_1 day Precipitaion 110000 233 12 110000 162 9 110000 223 15 110000 240 12 110000 276 3 110000 236 2 110000 244 9 110002 286 10 110002 179 19 110002 206 15 110002 143 11 110002 261 15

другая структура другого столбца:

id_station_2 day_1 day_2 Number 110000 184 263 1 110000 109 200 2 110000 115 356 3 110000 20 299 4 110000 120 279 5 110000 195 320 6 110000 121 275 7 110002 165 311 8 110002 140 329 9 110002 184 258 10 110002 127 228 11 110002 28 304 12 Я хочу получить Tirdтаблица с такой структурой:

другая структура другого столбца:

id_station day Precipitaion Number 110000 233 12 1 110000 162 9 2 110000 223 15 3 110000 240 12 4 110000 276 3 5 110000 236 2 6 110000 244 9 7 110002 286 10 8 110002 179 19 9 110002 206 15 10 110002 143 11 11 110002 261 15 12

Результат должен быть с двумя фильтрами: 1) id станции должны быть равны (id_station_1 = id_station_2) 2) день от первого столбца должен быть между днем ​​1 и днем ​​2 от второго столбца (день_1 <день <день_2) </p>

Если эти условия выполнены, мы должны получить третью таблицу с 3 тремя столбцами изпервая таблица и четвертый столбец со второго.Как я знаю, его следует использовать с функцией setkey .Но я не мог понять, как я должен использовать это правильно.Скажите пожалуйста, как мне использовать setkey (или другую функцию) в этом варианте?Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2019

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

Вот способ перехватить их все ... пожалуйста, измените порядок и переименуйте столбцы по мере необходимости

#normal left non-equi join
dt2[ dt1, on = c( "id_station_2 == id_station_1", "day_1 <= day", "day_2 >= day"), allow.cartesian = TRUE ]

пример данных

library( data.table )

dt1 <- fread("id_station_1    day Precipitaion
110000  233 12
110000  162 9
110000  223 15
110000  240 12
110000  276 3
110000  236 2
110000  244 9
110002  286 10
110002  179 19
110002  206 15
110002  143 11
110002  261 15")

dt2 <- fread("id_station_2   day_1   day_2   Number
110000  184 263 1
             110000  109 200 2
             110000  115 356 3
             110000  20  299 4
             110000  120 279 5
             110000  195 320 6
             110000  121 275 7
             110002  165 311 8
             110002  140 329 9
             110002  184 258 10
             110002  127 228 11
             110002  28  304 12")

Вы также можете поэкспериментировать с использованием foverlaps() из того же пакета ..

...