【问题标题】:Comparing dates across different data frames and return output比较不同数据框的日期并返回输出
【发布时间】:2022-02-09 00:57:33
【问题描述】:

我有两个数据框,其中包含同一个人的不同数据。数据框 1 (dfx) 具有唯一的 ID 和人们进行约会的日期,而数据框 2 具有唯一的 ID 以及开始和结束日期。

如下所示:

c1 <- c("1", "1", "1", "1", "1", "2", "2", "2", "2", "2")
d1 <- c("2017", "2018", "2019", "2020", "2021", "2019", "2019", "2019", "2020", "2021")

dfx <- data.frame(c1,d1)
c2 <- c("1", "1", "2")
ds <- c("2017", "2020", "2017")
de <- c("2018", "2021", "2018")

dfy <- data.frame(c2,ds,de) 

我正在使用数据框 2,我想知道数据框 1 中的日期是否在数据框 2 中的开始日期和结束日期之内。我试图在 dfy 中得到一个输出,说 TRUE 或 FALSE 表示重叠。

对于本例,输出应返回 TRUE、TRUE、FALSE。

我已经尝试在 dplyr 上使用它,但没有得到我正在寻找的结果。我会很感激任何帮助。谢谢。

dplyr 代码:

overlap <- dfy %>%
  group_by(c2) %>%
  mutate (on_hold = any(mapply(function(id, start, end) any(id == dfx$c1 & dfx$d1 > start & dfx$d1 < end), c2, ds, de))) %>%
  arrange(c2, ds, de, on_hold)

【问题讨论】:

    标签: r date if-statement dplyr


    【解决方案1】:

    解决方案

    ranges <- dfx %>%
      group_by(c1) %>%
      summarise(range = list(unique(d1)))
    
    left_join(dfy, ranges, by = c("c2" = "c1")) %>%
      rowwise() %>%
      mutate(in_range = ds %in% range & de %in% range)
    

    输出

    # A tibble: 3 x 5
    # Rowwise: 
      c2    ds    de    range     in_range
      <fct> <fct> <fct> <list>    <lgl>   
    1 1     2017  2018  <fct [5]> TRUE    
    2 1     2020  2021  <fct [5]> TRUE    
    3 2     2017  2018  <fct [3]> FALSE 
    

    OP 提供的数据

    c1 <- c("1", "1", "1", "1", "1", "2", "2", "2", "2", "2")
    d1 <- c("2017", "2018", "2019", "2020", "2021", "2019", "2019", "2019", "2020", "2021")
    
    dfx <- data.frame(c1,d1)
    
    c2 <- c("1", "1", "2")
    ds <- c("2017", "2020", "2017")
    de <- c("2018", "2021", "2018")
    
    dfy <- data.frame(c2,ds,de)
    

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2017-12-07
      • 2018-11-13
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多