@@ -135,21 +135,42 @@ knitr::kable(head(qw_greater))
135
135
So now to find the closest data in either direction, we can use some logic to determine the absolute closest values:
136
136
137
137
``` {r finalJoin}
138
+
139
+ closest_nums <- function(delta_uv_val,
140
+ delta_time_l, delta_time_g,
141
+ uv_val_l, uv_val_g){
142
+
143
+ case_when(delta_uv_val == 0 ~ uv_val_g,
144
+ is.na(uv_val_g) ~ uv_val_l,
145
+ is.na(uv_val_l) ~ uv_val_g,
146
+ delta_time_g < abs(delta_time_l) ~ uv_val_g,
147
+ delta_time_g >= abs(delta_time_l) ~ uv_val_l,
148
+ TRUE ~ uv_val_g)
149
+ }
150
+
151
+ closest_time <- function(delta_uv_val,
152
+ delta_time_l, delta_time_g,
153
+ uv_time_l, uv_time_g,
154
+ uv_val_l, uv_val_g){
155
+
156
+ case_when(delta_uv_val == 0 ~ uv_time_g,
157
+ is.na(uv_val_g) ~ uv_time_l,
158
+ is.na(uv_val_l) ~ uv_time_g,
159
+ delta_time_g < abs(delta_time_l) ~ uv_time_g,
160
+ delta_time_g >= abs(delta_time_l) ~ uv_time_l,
161
+ TRUE ~ uv_time_g)
162
+ }
163
+
138
164
qw_closest <- qw_greater |>
139
165
left_join(qw_less) |>
140
166
mutate(delta_uv_val = uv_val_close_greater - uv_val_close_less,
141
- val_uv = case_when(delta_uv_val == 0 ~ uv_val_close_greater,
142
- is.na(uv_val_close_greater) ~ uv_val_close_less,
143
- is.na(uv_val_close_less) ~ uv_val_close_greater,
144
- delta_time_greater < abs(delta_time_less) ~ uv_val_close_greater,
145
- delta_time_greater >= abs(delta_time_less) ~ uv_val_close_less,
146
- TRUE ~ uv_val_close_greater),
147
- closest_uv_dt = case_when(delta_uv_val == 0 ~ uv_date_greater,
148
- is.na(uv_val_close_greater) ~ uv_date_less,
149
- is.na(uv_val_close_less) ~ uv_date_greater,
150
- delta_time_greater < abs(delta_time_less) ~ uv_date_greater,
151
- delta_time_greater >= abs(delta_time_less) ~ uv_date_less,
152
- TRUE ~ uv_date_greater)) |>
167
+ val_uv = closest_nums(delta_uv_val,
168
+ delta_time_less, delta_time_greater,
169
+ uv_val_close_less, uv_val_close_greater),
170
+ closest_uv_dt = closest_time(delta_uv_val,
171
+ delta_time_less, delta_time_greater,
172
+ uv_date_less, uv_date_greater,
173
+ uv_val_close_less, uv_val_close_greater)) |>
153
174
select(-uv_date_greater, -uv_date_less,
154
175
-uv_val_close_greater, -uv_val_close_less,
155
176
-delta_time_greater, -delta_time_less) |>
@@ -189,7 +210,7 @@ uv_flow_qw2 <- uv_flow_qw |>
189
210
190
211
```
191
212
192
- Next, we'll create a function that does the same joins we described above, but adds some flexibility. You can see by the number of lines it gets pretty complicated pretty fast.
213
+ Next, we'll create a function that does the same joins we described above, but adds some flexibility. You can see by the number of lines it gets pretty complicated pretty fast. The function requires ` closest_nums ` and ` closest_time ` as described above.
193
214
194
215
The inputs are:
195
216
@@ -280,30 +301,22 @@ join_qw_uv <- function(qw_data, uv_flow_qw,
280
301
if("qw_val_close_greater" %in% names(qw_closest)){
281
302
qw_closest <- qw_closest |>
282
303
mutate(delta_qw_val = qw_val_close_greater - qw_val_close_less,
283
- qw_uv_val = case_when(delta_qw_val == 0 ~ qw_val_close_greater,
284
- is.na(qw_val_close_greater) ~ qw_val_close_less,
285
- is.na(qw_val_close_less) ~ qw_val_close_greater,
286
- delta_time_greater < abs(delta_time_less) ~ qw_val_close_greater,
287
- delta_time_greater >= abs(delta_time_less) ~ qw_val_close_less,
288
- TRUE ~ qw_val_close_greater),
289
- closest_uv = case_when(delta_qw_val == 0 ~ uv_date_greater,
290
- is.na(qw_val_close_greater) ~ uv_date_less,
291
- is.na(qw_val_close_less) ~ uv_date_greater,
292
- delta_time_greater < abs(delta_time_less) ~ uv_date_greater,
293
- delta_time_greater >= abs(delta_time_less) ~ uv_date_less,
294
- TRUE ~ uv_date_greater)) |>
304
+ qw_uv_val = closest_nums(delta_qw_val,
305
+ delta_time_less, delta_time_greater,
306
+ qw_val_close_less, qw_val_close_greater),
307
+ closest_uv = closest_time(delta_qw_val,
308
+ delta_time_less, delta_time_greater,
309
+ uv_date_less, uv_date_greater,
310
+ qw_val_close_less, qw_val_close_greater)) |>
295
311
select(-qw_val_close_greater, -qw_val_close_less) |>
296
312
select(qw_uv_val, {{ join_by_qw }}, closest_uv, everything())
297
313
}
298
314
299
315
if("qw_rmk_close_greater" %in% names(qw_closest)){
300
316
qw_closest <- qw_closest |> # breaks down if there wasn't a val but was a rmk
301
- mutate(qw_uv_rmk = case_when(delta_qw_val == 0 ~ qw_rmk_close_greater,
302
- is.na(qw_rmk_close_greater) ~ qw_rmk_close_less,
303
- is.na(qw_rmk_close_less) ~ qw_rmk_close_greater,
304
- delta_time_greater < abs(delta_time_less) ~ qw_rmk_close_greater,
305
- delta_time_greater >= abs(delta_time_less) ~ qw_rmk_close_less,
306
- TRUE ~ qw_rmk_close_greater)) |>
317
+ mutate(qw_uv_rmk = closest_nums(delta_qw_val,
318
+ delta_time_less, delta_time_greater,
319
+ qw_rmk_close_less, qw_rmk_close_greater)) |>
307
320
select(-qw_rmk_close_greater, -qw_rmk_close_less) |>
308
321
select(qw_uv_val, qw_uv_rmk,
309
322
{{ join_by_qw }}, closest_uv, everything())
@@ -312,36 +325,28 @@ join_qw_uv <- function(qw_data, uv_flow_qw,
312
325
if(!"closest_uv" %in% names(qw_closest)){
313
326
qw_closest <- qw_closest |>
314
327
mutate(delta_flow_val = flow_val_close_greater - flow_val_close_less,
315
- closest_uv = case_when(delta_flow_val == 0 ~ uv_date_greater,
316
- is.na(flow_val_close_greater) ~ uv_date_less,
317
- is.na(flow_val_close_less) ~ uv_date_greater,
318
- delta_time_greater < abs(delta_time_less) ~ uv_date_greater,
319
- delta_time_greater >= abs(delta_time_less) ~ uv_date_less,
320
- TRUE ~ uv_date_greater))
328
+ closest_uv = closest_time(delta_flow_val,
329
+ delta_time_less, delta_time_greater,
330
+ uv_date_less, uv_date_greater,
331
+ flow_val_close_less, flow_val_close_greater))
321
332
}
322
333
323
334
if("flow_val_close_greater" %in% names(qw_closest)){
324
335
325
336
qw_closest <- qw_closest |>
326
337
mutate(delta_flow_val = flow_val_close_greater - flow_val_close_less,
327
- flow_val = case_when(delta_flow_val == 0 ~ flow_val_close_greater,
328
- is.na(flow_val_close_greater) ~ flow_val_close_less,
329
- is.na(flow_val_close_less) ~ flow_val_close_greater,
330
- delta_time_greater < abs(delta_time_less) ~ flow_val_close_greater,
331
- delta_time_greater >= abs(delta_time_less) ~ flow_val_close_less,
332
- TRUE ~ flow_val_close_greater)) |>
338
+ flow_val = closest_nums(delta_flow_val,
339
+ delta_time_less, delta_time_greater,
340
+ flow_val_close_less, flow_val_close_greater)) |>
333
341
select(-flow_val_close_greater, -flow_val_close_less) |>
334
342
select(uv_flow_val = flow_val, {{ join_by_qw }}, closest_uv, everything())
335
343
}
336
344
337
345
if("flow_rmk_close_greater" %in% names(qw_closest)){
338
346
qw_closest <- qw_closest |>
339
- mutate(flow_rmk = case_when(delta_flow_val == 0 ~ flow_rmk_close_greater,
340
- is.na(flow_rmk_close_greater) ~ flow_rmk_close_less,
341
- is.na(flow_rmk_close_less) ~ flow_rmk_close_greater,
342
- delta_time_greater < abs(delta_time_less) ~ flow_rmk_close_greater,
343
- delta_time_greater >= abs(delta_time_less) ~ flow_rmk_close_less,
344
- TRUE ~ flow_rmk_close_greater)) |>
347
+ mutate(flow_rmk = closest_nums(delta_flow_val,
348
+ delta_time_less, delta_time_greater,
349
+ flow_rmk_close_less, flow_rmk_close_greater)) |>
345
350
select(-flow_rmk_close_greater, -flow_rmk_close_less) |>
346
351
select(uv_flow_val, uv_flow_rmk = flow_rmk,
347
352
{{ join_by_qw }}, closest_uv, everything())
0 commit comments