【问题标题】:Check if a date is in range of lookup table检查日期是否在查找表的范围内
【发布时间】:2018-10-13 13:24:08
【问题描述】:

我有一个如下所示的数据集:

library(data.table)
library(magrittr)

Data1 <- data.table(
  ID_a = c(1, 1, 2, 1, 2),
  ID_b = c(1, 1, 1, 2, 2),
  Date_1 = c("2018-01-01", "2018-05-01", "2018-07-01", "2018-09-01", "2018-10-01") %>% 
    as.Date
)

ID_a 和 ID_b 这两个变量是 ID 变量。现在我有另一个数据集,如下所示:

Data2 <- data.table(
  ID_a = c(1, 1, 2, 1, 2),
  ID_b = c(1, 1, 1, 2, 2),
  Date_start = c("2018-01-01", "2018-03-01", "2018-04-01", "2018-05-01", "2018-08-01") %>% 
    as.Date,
  Date_end = c("2018-02-01", "2018-04-01", "2018-06-01", "2018-08-01", "2018-10-01") %>% 
    as.Date
)

现在我想检查第一个数据集的每一行,如果日期至少在(!)Date_startDate_end 之间的一个范围内,并且第二个数据集的 ID 值相同。输出应如下所示(第一个为 TRUE,因为它在 ID_a == 1ID_b == 1 的第一个范围内):

TRUE, FALSE, FALSE, FALSE, TRUE

【问题讨论】:

  • 你有 5 行,你想要的输出是一个长度为 6 的向量。这是一个错误吗?
  • 是的,对不起!一个 FALSE 太多了。

标签: r date join data.table range


【解决方案1】:

的可能解决方案:

Data1[Data2
      , on = .(ID_a, ID_b, Date_1 >= Date_start, Date_1 <= Date_end)
      , test := between(x.Date_1, i.Date_start, i.Date_end)
      ][is.na(test), test := FALSE][]

给出:

> Data1
   ID_a ID_b     Date_1  test
1:    1    1 2018-01-01  TRUE
2:    1    1 2018-05-01 FALSE
3:    2    1 2018-07-01 FALSE
4:    1    2 2018-09-01 FALSE
5:    2    2 2018-10-01  TRUE

【讨论】:

    【解决方案2】:

    这是使用dplyr 的一种方式-

    left_join(Data1, Data2, by = c("ID_a", "ID_b")) %>%
      mutate(test = Date_1 >= Date_start & Date_1 <= Date_end) %>%
      group_by(ID_a, ID_b, Date_1) %>%
      summarise(test = any(test)) %>%
      ungroup()
    
    # A tibble: 5 x 4
       ID_a  ID_b Date_1     test 
      <dbl> <dbl> <date>     <lgl>
    1    1.    1. 2018-01-01 TRUE 
    2    1.    1. 2018-05-01 FALSE
    3    1.    2. 2018-09-01 FALSE
    4    2.    1. 2018-07-01 FALSE
    5    2.    2. 2018-10-01 TRUE
    

    【讨论】:

    • 它只给了我一个“真”,但我知道你的意思,太好了!我在 data.table 中做了同样的事情: Data1 % .[, Test := Date_1 >= Date_start & Date_1 % .[, .(Test2 = any(Test)), .(Date_1, ID_a, ID_b)]
    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多