我目前正在处理此文件,其中列出了自 1943 年以来法国公社(地方当局)发生的行政事件。
我对变量
DATE_EFF
、COM_AV
和 COM_AP
感兴趣,尤其是 COM_AV
与 COM_AP
不同的观察结果:
data <-
readr::read_csv("v_mvt_commune_2024.csv") |>
dplyr::select(DATE_EFF, COM_AV, COM_AP) |>
dplyr::filter(COM_AV != COM_AP)
这是 10 行的示例:
“DATE_EFF” | “COM_AV” | “COM_AP” |
---|---|---|
1973-01-01 | “64031” | “64113” |
1968-01-01 | “78675” | “95675” |
2017-01-01 | “86030” | “86281” |
2002-09-01 | “07021” | “07207” |
2005-01-01 | “52359” | “52495” |
1969-12-01 | “25423” | “25138” |
1973-01-01 | “79232” | “79123” |
1973-04-01 | “70209” | “70528” |
2014-04-17 | “05002” | “05139” |
1977-11-15 | “64113” | “64031” |
在此期间,每个公社可能都发生了一些变化。
例如,在上面的示例中,我们可以看到:
64031
变成了 64113
中的
1973-01-01
64113
变成了 64031
中的
1977-11-15
我想要一个表格,其中
COM_AV
包含第一个值,COM_AP
包含最后一个值,如下所示:
“COM_AV” | “COM_AP” |
---|---|
“64031” | “64031” |
这假设多个
COM_AV
可以指向同一个COM_AP
,当然,COM_AV
并不总是与COM_AP
相同。
使用
tidyverse
解决此问题最有效的方法是什么?
对于相当小的数据集,一种方法是使用迭代。
f <- function(data) {
# Create a minimum data
data_1 <- slice_min(data, DATE_EFF, by=COM_AV, with_ties=FALSE, n=1)
for(i in 1:nrow(data)) {
AP <- data_1$COM_AP[i]
# Find rows in the whole data containing this AP value in COM_AV
AP_2 <- filter(data, COM_AV==AP)
# While rows exist in the data with COM_AV containing this AP value
while(nrow(AP_2)>0) {
# Find the row with the minimum value for DATE_EFF
AP_2 <- slice_min(AP_2, DATE_EFF, by=COM_AV, with_ties=FALSE, n=1)
# Save the date
DATE_EFF <- pull(AP_2, DATE_EFF)
# update COM_AP with the last value found
data_1$COM_AP[i] <- pull(AP_2, COM_AP)
# Try to find another
AP_2 <- filter(data, COM_AV==AP & DATE_EFF>DATE_EFF)
}
}
data_1
}
data_2 <- f(data)
filter(data_2, COM_AV=="64031")
# A tibble: 1 × 3
DATE_EFF COM_AV COM_AP
<date> <chr> <chr>
1 1973-01-01 64031 64031