r - 如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行
问题描述
我有两个数据集。第一个数据集对于每个 ID 都有两个日期列(开始、停止)。有时它可以包含每个 ID 的多个开始-停止日期。
数据集1
Id Code Start Stop
431 279 2017-11-15 2019-08-15
431 578 2019-09-15 2021-01-15
832 590 2008-04-15 2020-05-15
832 519 2020-06-15 2021-04-15
第二个数据集有 Id 和每个 ID 的许多时间戳行,如下所示
Id Weight Date
431 12.23 2018
832 15.12 2020
832 6.78 2020
832 4.27 2007
我的目标是创建一个列InBetween
,如果第二个数据集中的行在第一个数据集中的两个日期之间,则创建一个列,如果第二个数据集中的行不在第一个数据集中的两个日期之间,则创建一个指示“否”的列,其他像这样来自第一个数据集的列。
Id Weight Date Between Code Start Stop
431 12.23 2018 Yes 279 2017-11-15 2019-08-15
832 15.12 2020 Yes 590 2008-04-15 2020-05-15
832 6.78 2020 Yes 590 2008-04-15 2020-05-15
832 4.27 2007 No NA NA NA
我可以使用 for 循环来做到这一点,但我更喜欢使用 dplyr、innerjoin 或其他没有 forloops 的选项的任何解决方案。提前致谢。
解决方案
很乱,但你可以试试
df2 %>%
full_join(df1, by = "Id") %>%
mutate(Date = as.Date(ISOdate(Date,1,1)),
Start = as.Date(Start),
Stop = as.Date(Stop)) %>%
rowwise %>%
mutate(Between = between(Date, Start, Stop)) %>%
group_by(Id, Date) %>%
mutate(check = any(Between)) %>%
filter(!(Between == FALSE& check == TRUE)) %>%
mutate(Start = ifelse(check, Start, NA),
Stop = ifelse(check, Stop, NA),
Code = ifelse(check, Code, NA)) %>%
distinct() %>% select(-check)
Id Weight Date Code Start Stop Between
<int> <dbl> <date> <int> <dbl> <dbl> <lgl>
1 431 12.2 2018-01-01 279 17485 18123 TRUE
2 832 15.1 2020-01-01 590 13984 18397 TRUE
3 832 6.78 2020-01-01 590 13984 18397 TRUE
4 832 4.27 2007-01-01 NA NA NA FALSE
推荐阅读
- excel - 使用 Openpyxl 将数据框附加到现有 Excel 工作表
- airflow - 创建 dag 运行时将参数传递给 Airflow Experimental REST api
- python - 如何整合所有区间?
- c# - WCF 服务仅返回基类
- amazon-web-services - AWS Route53 按过期搜索/排序域
- javascript - 隐藏/显示按钮在 jquery 中不起作用
- docker - docker pull 中发生错误
- c# - 更改分离子对象的父级 - 实体框架 6
- r - 根据条件创建新的数值变量
- java - 在动态 LinearLayout 中添加 RadioGroup