Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 检查日期是否在查找表的范围内_R_Date_Join_Data.table_Range - Fatal编程技术网

R 检查日期是否在查找表的范围内

R 检查日期是否在查找表的范围内,r,date,join,data.table,range,R,Date,Join,Data.table,Range,我的数据集如下所示: 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 ) Data2 <- data

我的数据集如下所示:

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
)
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
)

这里有一种使用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
left_-join(Data1,Data2,by=c(“ID_a”,“ID_b”))%>%
变异(测试=日期1>=开始日期和日期1%
分组人(身份证a、身份证b、日期1)%>%
总结(测试=任何(测试))%>%
解组()
#一个tibble:5x4
身份证日期1测试
1.1.2018-01-01真实
2.1.1.2018-05-01假
3.1.2.2018-09-01假
4.2.1.2018-07-01假
5.2.2.2018-10-01真实
可能的解决方案包括:


您有5行,所需的输出是长度为6的向量。这是错误吗?是的,抱歉!一个FALSE太多了。它只给了我一个“TRUE”,但我知道您的意思,太好了!我在数据中也做了同样的操作。表:Data1%.[Test:=Date\u 1>=Date\u start&Date\u 1%.[,(Test2=any(Test)),(Date\u 1,ID\u a,ID\b)]
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
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