通过基于日期的排列从长表中获取第一个和最后一个值

问题描述 投票:0回答:1

我目前正在处理此文件,其中列出了自 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”

在此期间,每个公社可能都发生了一些变化。

例如,在上面的示例中,我们可以看到:

  1. 64031
    变成了
    64113
     中的 
    1973-01-01
  2. 64113
    变成了
    64031
     中的 
    1977-11-15

我想要一个表格,其中

COM_AV
包含第一个值,
COM_AP
包含最后一个值,如下所示:

“COM_AV” “COM_AP”
“64031” “64031”

这假设多个

COM_AV
可以指向同一个
COM_AP
,当然,
COM_AV
并不总是与
COM_AP
相同。

使用

tidyverse
解决此问题最有效的方法是什么?

r
1个回答
0
投票

对于相当小的数据集,一种方法是使用迭代。

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
© www.soinside.com 2019 - 2024. All rights reserved.