#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)