【发布时间】:2021-06-26 23:51:09
【问题描述】:
我想根据更改的数据框创建一个查找表。原始数据框的每一行都表示给定地区编码的变化。该数据集涵盖了 2009 年至 2019 年的某个时间段。虽然一个地区在该时间段内可能会经历多次变化,但我想要 2009 年和 2019 年每个区的编码。也就是第一个和最新的编码。
数据框覆盖数百个地区。一些地区可能只进行一次更改,而另一些地区可能会进行多次更改。一个地区可以合并或拆分为多个其他地区。
理想的查找表如下所示:
| coding_2009 | coding_2019 |
|---|---|
| 00QR | S12000047 |
| 00QR | S12000048 |
| 00RB | S12000047 |
| 00RB | S12000048 |
coding_2009 是该区截至 2009 年的编码,coding_2019 是其截至 2019 年的最新编码。
每行显示变化的原始数据框(子集)如下所示:
| past | new | date |
|---|---|---|
| 00QR | S12000015 | 2009-01-01 |
| S12000015 | S12000047 | 2018-02-02 |
| S12000015 | S12000048 | 2018-02-02 |
| 00RB | S12000015 | 2009-01-01 |
| S12000024 | S12000047 | 2018-02-02 |
| S12000024 | S12000048 | 2018-02-02 |
对于每一行,past 是从date 重新编码为new 的代码。
比如区00QR变成S12000015,后来又拆分成S12000047和S12000048。
我已经处理这个问题好几个星期了,尝试了不同的临时版本,但似乎没有一个能始终如一地解决。请注意,代码需要考虑一些地区只经历一次变化,而其他地区可能经历两次或更多变化。如示例所示,区域也可以拆分或合并。
理想的答案是使用tidyverse。
对于 reprex,我在下面选择了一些地区的子集。
感谢您的帮助!将不胜感激。
重复数据:
(您也可以超越并使用原始数据集,Changes.csv。请参见下面的链接)
# Library tibble (a part of tidyverse) is needed to copy paste reprex data
#install.packages("tibble") # if you need to install it
library(tibble)
data <- tibble::tribble(
~past, ~new, ~date,
"00RJ", "S12000013", "2009-01-01",
"00QR", "S12000015", "2009-01-01",
"00RB", "S12000024", "2009-01-01",
"13UD", "E07000015", "2009-01-01",
"15UH", "E07000025", "2009-01-01",
"00HC", "E06000024", "2009-01-01",
"00KG", "E06000034", "2009-01-01",
"19UD", "E07000049", "2009-01-01",
"19UE", "E07000050", "2009-01-01",
"19UG", "E07000051", "2009-01-01",
"19UH", "E07000052", "2009-01-01",
"19UJ", "E07000053", "2009-01-01",
"E07000017", "E06000049", "2009-04-01",
"E07000025", "E06000053", "2009-04-01",
"E07000014", "E06000049", "2009-04-01",
"E07000015", "E06000049", "2009-04-01",
"S12000013", "S12000013", "2015-06-16",
"S12000013", "S12000013", "2015-11-01",
"S12000015", "S12000047", "2018-02-02",
"S12000024", "S12000047", "2018-02-02",
"S12000015", "S12000048", "2018-02-02",
"S12000024", "S12000048", "2018-02-02",
"E07000049", "E06000059", "2019-04-01",
"E07000050", "E06000059", "2019-04-01",
"E07000053", "E06000059", "2019-04-01",
"E07000051", "E06000059", "2019-04-01",
"E07000052", "E06000059", "2019-04-01"
)
# Convert date to Date (after being copy pasted as tibble)
data$date <- as.Date(data$date)
对于任何感兴趣的人,此数据来自英国的Code History Database。您可以从下面的链接下载 zip。这是名为Changes.csv:https://geoportal.statistics.gov.uk/datasets/code-history-database-december-2019-for-the-united-kingdom 的文件。请注意,在Changes.csv 中,past 被命名为geogcd_p,new 被命名为geogcd 和date 被命名为oper_date。
【问题讨论】:
标签: r dataframe dplyr tidyverse lookup-tables