首页 文章

基于具有多个匹配的另一数据帧来变异列

提问于
浏览
0

我有以下数据框架

DF1

ID    PMT_DATE
100   2015/01/01
100   2015/02/01
100   2015/04/01 
200   2016/01/01
200   2016/02/01

和df2

ID    DATE         STATUS    
100   2014/12/31   A
100   2015/03/15   B
200   2015/12/31   A  
200   2016/06/01   C

我将使用df2中的STATUS列创建一个df1的数据框 . 如果df1中的PMT_DATE列大于或等于df2中的DATE列,则df2中的关联状态应放在新数据帧中 . 生成的数据框应如下所示

ID    PMT_DATE     STATUS
100   2015/01/01   A
100   2015/02/01   A
100   2015/04/01   B 
200   2016/01/01   A
200   2016/02/01   A

通常我会加入这两个表,创建一个新列并使用mutate执行计算并删除我不再需要的列,但由于df1和df2中的ID列中有多个匹配,我不能完全实施该战略 .

编辑:对于多个匹配,我想要最新的状态 . 例如,ID == 100的最后一行将属于Status == A和Status == B,但我只想要状态B.此外,两个数据帧中的ID字段表示相同的事物(即ID的连接)是我想要的) .

我正在考虑的事情

new_df <- df1 %>% rowwise() $>% do() ...

但我不知道如何填补其余部分来实现我的需要 .

2 回答

  • 2

    这是一种使用 dplyr 的方法 . 我们的想法是先加入表格,然后用 PMT_DATE >= DATE 过滤掉该行 . 我想你只想要最新的 STATUSSTATUS 与最新的 DATE 相关联) .

    library(dplyr)
    
    df1 %>% 
      left_join(df2, by="ID") %>%
      filter(PMT_DATE >= DATE) %>% 
      group_by(ID, PMT_DATE) %>% 
      slice(n()) %>% # get the latest status
      select(-DATE) %>%
      ungroup()
    
    # # A tibble: 5 x 3
    #      ID   PMT_DATE STATUS
    #   <int>      <chr>  <chr>
    # 1   100 2015/01/01      A
    # 2   100 2015/02/01      A
    # 3   100 2015/04/01      B
    # 4   200 2016/01/01      A
    # 5   200 2016/02/01      A
    
  • 0

    我不确定是否可以使用 dplyr 进行滚动连接 . 这就是我要用 data.table 来获取最新的 STATUS

    library(data.table)
    setDT(df2)[setDT(df1), on = .(ID, DATE = PMT_DATE), roll = Inf]
    

    ID日期状态
    1:100 2015-01-01 A
    2:100 2015-02-01 A
    3:100 2015-04-01 B.
    4:200 2016-01-01 A
    5:200 2016-02-01 A

    数据

    df1 <- readr::read_table(
      "ID    PMT_DATE
    100   2015/01/01
    100   2015/02/01
    100   2015/04/01 
    200   2016/01/01
    200   2016/02/01"
    )
    df2 <- readr::read_table(
      "ID    DATE         STATUS    
    100   2014/12/31   A
    100   2015/03/15   B
    200   2015/12/31   A  
    200   2016/06/01   C"
    )
    

相关问题