R / dplyr: Объединение двух таблиц с широким и длинным форматом в соединяемых столбцах

#r #dplyr #left-join

Вопрос:

Я работаю с некоторыми данными публичных адресов, которые я хочу объединить, но я не уверен в наилучшем подходе и в том, как этого добиться из-за различного более широкого и более длинного форматирования столбцов для объединения.

Моя первая таблица содержит все адреса в стране; почтовый индекс номер адреса приводят к уникальным комбинациям. Каждый адрес также связан с конкретным районом и районом в каждом округе. Эта таблица не содержит никакой другой информации.

Моя вторая таблица содержит соответствующую информацию о каждом районе, районе и округе, такую как количество мест жительства, возраст жителей, потребление энергии и т.д. Идея состоит в том, чтобы просто объединить эту информацию с полным списком адресов, чтобы я мог просматривать эту статистику по каждому адресу в стране.

Что вызывает у меня головную боль, так это разное форматирование обеих таблиц.

Первая таблица отформатирована следующим образом, чтобы каждая комбинация адреса почтовый индекс была уникальной (но разные адреса могут находиться в одном и том же округе, районе или районе).:

 adresses <- data.frame("postal_code" = c("1000A", "1010A", "1000B", "1100B", "1500C", "2700C"),  
                 "adress_nr" = c(1, 2, 3, 15, 1, 35), 
                 "neighborhood" = c("A1", "A2", "B1", "B1", "C5", "C7"),
                 "area" = c("AA1", "AA2", "BB2", "BB1", "CC1", "CC3"),
                 "county" = c("AAA", "AAA", "BBB", "BBB", "CCC", "CCC")
                   )

 

Вторая таблица имеет длинный формат, в котором один столбец содержит все уникальные значения как для района, так и для области (для всего округа).:

 neighborhood_area_data <- data.frame(
"county" = c("AAA", "AAA", "AAA", "AAA", "BBB", "BBB", "BBB", "BBB", "CCC", "CCC", "CCC"), 
"neighborhood_and_area" = c("NEIGH_A1", "AREA_AA1", "AREA_AA2", "NEIGH_A2", "AREA_BB2", "AREA_BB1", "NEIGH_B1", "NEIGH_C5", "NEIGH_C7", "AREA_CC3", "AREA_CC7"),
"type" = c("Neighborhood", "Area", "Area", "Neighborhood",  "Area", "Area", "Neighborhood", "Neighborhood", "Neighboordhood", "Area", "Area"),
"Number_of_Residents" = c(10, 50, 40, 30, 100, 70, 80, 60, 70, 70, 20),
"Average_Age" = c(55, 44, 33, 22, 66, 77, 55, 88, 99, 44, 11))

 

Таким образом, для каждого всеобъемлющего округа у вас будут данные по всем его существующим районам и районам. Идентификаторы которых хранятся в одном столбце, отсюда и длинный формат. Части строки «NEIGH_» и «AREA_» определяют, является ли это окрестностью или областью, и я удаляю их из строки, чтобы иметь возможность присоединиться к ним).

В моем примере интересующими данными будут столбцы Number_of_Residents и Average_Age, которые я хочу объединить в таблицу отдельных адресов.

То, что я ищу, — это надежный подход/способ объединить эти таблицы (предпочтительно с помощью dplyr).

Мой первоначальный подход состоял в том, чтобы взять вторую таблицу и разделить окрестности и область на отдельные столбцы (соседство и область), удалив идентификатор (например, «NEIGH_AA1»-> «AA1″часть строки). Однако из-за отсутствия суммирования/поворота вторая таблица сохраняет свой первоначальный формат и не будет соединяться должным образом. Я не уверен, что это лучший/самый элегантный способ согласовать эти два формата.

Надеюсь, мой вопрос и примеры понятны! Спасибо!

Комментарии:

1. Можете ли вы дать желаемый результат? Не уверен, как бы вы хотели, чтобы выглядел ваш финальный стол…

Ответ №1:

Предполагая, что вы хотите сохранить данные как о районе, так и о местности:

 library(tidyverse)

area_data <- 
    neighborhood_area_data %>% 
    separate(neighborhood_and_area, into = c(NA, 'code'), sep = '_') %>% 
    filter(grepl('Area', type)) %>% 
    rename(Area_Number_of_Residents = Number_of_Residents, 
           Area_Average_Age = Average_Age) %>%
    select(-type)

neighborhood_data <- 
    neighborhood_area_data %>% 
    separate(neighborhood_and_area, into = c(NA, 'code'), sep = '_') %>% 
    filter(!grepl('Area', type)) %>% 
    rename(Neighborhood_Number_of_Residents = Number_of_Residents, 
           Neighborhood_Average_Age = Average_Age) %>%
    select(-type)

 

Затем вы можете присоединиться к каждому из разделенных наборов данных:

 adresses %>% 
    left_join(area_data, 
              by = c('county', 'area' = 'code')) %>% 
    left_join(neighborhood_data, 
              by = c('county', 'neighborhood' = 'code'))

 

Выход:

   postal_code adress_nr neighborhood area county Area_Number_of_Residents Area_Average_Age Neighborhood_Number_of_Residents Neighborhood_Average_Age
1       1000A         1           A1  AA1    AAA                       50               44                               10                       55
2       1010A         2           A2  AA2    AAA                       40               33                               30                       22
3       1000B         3           B1  BB2    BBB                      100               66                               80                       55
4       1100B        15           B1  BB1    BBB                       70               77                               80                       55
5       1500C         1           C5  CC1    CCC                       NA               NA                               NA                       NA
6       2700C        35           C7  CC3    CCC                       70               44                               70                       99