【问题标题】:R / dplyr: Joining two tables with wide vs. long format on joinable columnsR / dplyr:在可连接列上连接两个具有宽格式和长格式的表
【发布时间】:2021-10-04 17:08:00
【问题描述】:

我正在处理一些我想加入的公共地址数据,但我不确定最佳方法以及如何实现这一点,因为要加入的列的更宽和更长的格式不同。

我的第一个表包含该国的所有地址;邮政编码+地址号码导致独特的组合。每个地址还与每个县的特定社区和区域相关。此表不包含任何其他信息。

我的第二个表包含有关每个社区、地区和县的相关信息,例如住宅数量、居民年龄、能源消耗等。这个想法只是将这些信息与完整的地址列表合并,以便我可以查看这些信息全国每个地址的统计数据。

让我头疼的是两个表格的不同格式。

第一个表格的格式如下,地址+邮政编码的每个组合都是唯一的(但不同的地址可以在同一个县、地区或街区):

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

第二个表格的格式很长,其中一列包含 BOTH 邻域和区域(每个总体县)的所有唯一值:

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

因此,对于每个总体县,您将拥有所有其现有区域和社区的数据。其中的 ID 存储在单个列中,因此是长格式。字符串的“N​​EIGH_”和“AREA_”部分标识它是社区还是区域,我将它们从字符串中删除以便能够加入它们。

在我的示例中,感兴趣的数据是我想加入到个人地址表中的 Number_of_Residents 和 Average_Age 列。

我正在寻找的是一种组合这些表的可靠方法/方式(最好通过 dplyr)。

我最初的方法是使用第二个表,将neighborhood_and_area 分成单独的列(neighboorhood 和area),同时删除标识符(例如,字符串的“N​​EIGH_AA1”->“AA1”部分)。但是,由于没有汇总/透视,第二个表保留其原始格式并且不会正确连接。我不确定协调这两种格式的最佳/最优雅的方式是什么。

希望我的问题和例子很清楚!谢谢!

【问题讨论】:

  • 你能给出想要的输出吗?不知道你希望你的决赛桌是什么样子......

标签: r dplyr left-join


【解决方案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


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多