Случайный выбор значения из дубликатов в ключевом кадре при выполнении соединения

#r #join #dplyr

#r #Присоединиться #dplyr

Вопрос:

Я хочу создать новую переменную местоположения в фрейме данных, используя ключ из эталонного фрейма данных по пригороду и почтовому индексу. Однако ссылочный фрейм данных имеет перекрытия / дубликаты в ключе из-за характера географических структур в Сиднее, Австралия. Это выглядит примерно так: почтовый индекс и пригород являются ключевыми переменными, но между ними есть перекрытие. Я назначаю пригород своим строкам в моем фрейме данных из ссылочного df.

 df <- tibble(vars = sample(c(1:5), 10, replace = T), 
             postcode = c(2022,2204,2016,2000,2007,2008,2022,2008,2008,2000))
df_ref <- tibble(postcode = c(2000,2000,2007,2008,2008,2022,2204),
                 suburb = c('Haymarket','Woolloomooloo','Ultimo','Darlington','Redfern','Bondi Jct','Marrickville'))
 

До сих пор я объединял фреймы данных в a left_join , но выполнял некоторые внутренние dplyr пререкания, чтобы отфильтровать первое из любых перекрытий:

 df_join <- df %>%
  left_join(.,
            df_ref %>% 
              group_by(postcode) %>% 
              slice(1),
            by = 'postcode')
 

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

dplyr / tidyverse язык предпочтительнее, но если data.table это так, это может заставить меня сесть, чтобы действительно изучить его!

Ответ №1:

Вы можете объединить два фрейма данных и для каждой строки выбрать любой случайный suburb .

 library(dplyr)

df %>%
  mutate(row = row_number()) %>%
  left_join(df_ref, by = 'postcode') %>%
  group_by(row) %>%
  slice_sample(n = 1)
 

Ответ №2:

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

 df %>%
  mutate(record_index = row_number()) %>% 
  left_join(df_ref) %>% 
  group_by(postcode) %>% 
  slice_sample(1) %>% 
  select(-record_index)