@@ -109,27 +109,28 @@ get_bilateral_trade <- function(file_path) {
109109 get_wide_cbs() | >
110110 dplyr :: select(year , item , area_code , export , import )
111111
112- btd <-
113- file_path | >
112+ btd <- file_path | >
114113 readr :: read_csv(show_col_types = FALSE ) | >
115114 .clean_bilateral_trade()
116115
117116 codes <- .get_all_country_codes(btd , cbs )
118117
119118 btd | >
120- .build_trade_matrices(cbs , codes ) | >
121- .fill_all_missing_trade(cbs ) | >
122- .balance_matrices() | >
119+ .nest_by_year_item(cbs , codes ) | >
120+ .process_bilateral_trade(codes ) | >
123121 dplyr :: select(- total_trade )
124122}
125123
126- .balance_matrices <- function (btd ) {
124+ .process_bilateral_trade <- function (btd , codes ) {
127125 btd | >
128126 dplyr :: mutate(
129127 bilateral_trade = purrr :: map2(
130128 bilateral_trade ,
131129 total_trade ,
132- .balance_matrix
130+ ~ .x | >
131+ .build_trade_matrix(codes ) | >
132+ .fill_missing_trade(.y ) | >
133+ .balance_matrix(.y )
133134 )
134135 )
135136}
@@ -180,6 +181,7 @@ get_bilateral_trade <- function(file_path) {
180181 unit = ifelse(unit == " Head" , " heads" , unit ),
181182 from_code = ifelse(element == " Export" , area_code , area_code_p ),
182183 to_code = ifelse(element == " Export" , area_code_p , area_code ),
184+ dplyr :: across(c(year , from_code , to_code ), as.integer )
183185 ) | >
184186 .prefer_flow_direction(" Export" ) | >
185187 dplyr :: select(year , from_code , to_code , item , unit , value )
@@ -199,17 +201,6 @@ get_bilateral_trade <- function(file_path) {
199201 dplyr :: bind_rows(preferred_direction )
200202}
201203
202- .fill_all_missing_trade <- function (btd , cbs ) {
203- btd | >
204- dplyr :: mutate(
205- bilateral_trade = purrr :: map2(
206- bilateral_trade ,
207- total_trade ,
208- .fill_missing_trade
209- )
210- )
211- }
212-
213204.fill_missing_trade <- function (trade_matrix , total_trade ) {
214205 exports <- total_trade | >
215206 dplyr :: pull(export )
@@ -249,47 +240,49 @@ get_bilateral_trade <- function(file_path) {
249240 }
250241}
251242
252- .build_trade_matrices <- function (btd , cbs , codes ) {
243+ .nest_by_year_item <- function (btd , cbs , codes ) {
244+ cbs <- cbs | >
245+ dplyr :: mutate(area_code = factor (area_code , levels = codes ))
246+
253247 btd | >
254248 dplyr :: filter(unit == " tonnes" ) | >
255249 dplyr :: select(- unit ) | >
250+ dplyr :: mutate(
251+ from_code = factor (from_code , levels = codes ),
252+ to_code = factor (to_code , levels = codes ),
253+ ) | >
256254 .filter_only_items_in_cbs(cbs ) | >
257255 tidyr :: nest(
258256 bilateral_trade = c(from_code , to_code , value ),
259257 .by = c(year , item )
260258 ) | >
261- dplyr :: left_join(.get_nested_cbs(cbs , codes ), c(" year" , " item" )) | >
262- dplyr :: mutate(
263- bilateral_trade = purrr :: map(
264- bilateral_trade ,
265- ~ .build_trade_matrix(.x , codes )
266- )
267- )
259+ dplyr :: left_join(.get_nested_cbs(cbs , codes ), c(" year" , " item" ))
268260}
269261
270262.get_nested_cbs <- function (cbs , codes ) {
271263 cbs | >
264+ dplyr :: mutate(item = as.factor(item )) | >
265+ .complete_total_trade(codes ) | >
266+ dplyr :: group_by(year , item ) | >
267+ .balance_total_trade() | >
268+ dplyr :: ungroup() | >
272269 tidyr :: nest(
273- total_trade = c(area_code , export , import ),
270+ total_trade = c(
271+ area_code , export , import , balanced_export , balanced_import
272+ ),
274273 .by = c(year , item )
275- ) | >
276- dplyr :: mutate(
277- total_trade = purrr :: map(
278- total_trade ,
279- ~ .x | >
280- .complete_total_trade(codes ) | >
281- .balance_total_trade()
282- )
283274 )
284275}
285276
286277.complete_total_trade <- function (total_trade , codes ) {
278+ df_codes <- tibble :: tibble(area_code = codes )
279+ combs <- total_trade | >
280+ dplyr :: distinct(year , item ) | >
281+ dplyr :: cross_join(df_codes )
282+
287283 total_trade | >
288- tidyr :: complete(
289- area_code = codes ,
290- fill = list (export = 0 , import = 0 )
291- ) | >
292- dplyr :: arrange(area_code )
284+ dplyr :: right_join(combs , by = c(" year" , " item" , " area_code" )) | >
285+ tidyr :: replace_na(list (export = 0 , import = 0 ))
293286}
294287
295288.filter_only_items_in_cbs <- function (btd , cbs ) {
@@ -317,13 +310,18 @@ get_bilateral_trade <- function(file_path) {
317310 dplyr :: pull(cbs , area_code )
318311 ) | >
319312 unique() | >
320- sort()
313+ sort() | >
314+ as.factor()
321315}
322316
323317.build_trade_matrix <- function (btd , codes ) {
324318 btd | >
325- tidyr :: complete(from_code = codes , to_code = codes ) | >
326- tidyr :: pivot_wider(names_from = to_code , values_from = value ) | >
319+ tidyr :: pivot_wider(
320+ names_from = to_code ,
321+ values_from = value ,
322+ names_expand = TRUE
323+ ) | >
324+ tidyr :: complete(from_code = codes ) | >
327325 tibble :: column_to_rownames(var = " from_code" ) | >
328326 as.matrix()
329327}
0 commit comments