【问题标题】:How to subset dataframes based on date range in another dataframe that has multiple matching ID's in R如何根据 R 中具有多个匹配 ID 的另一个数据框中的日期范围对数据框进行子集化
【发布时间】:2023-01-28 00:20:53
【问题描述】:

我查看了一些解决方案,但未能找到任何包含 ID 多次出现的观察结果的内容。我的数据在数据框 1 (df1) 中看起来像这样

Name <- c("Doe, John","Doe, John","Doe, John", "Doe, Jane", "Doe, Jane","Doe, Jane","Parker, Peter","Parker, Peter","Parker, Peter", "Stark, Tony","Stark, Tony","Stark, Tony")
Accession <- c(123, 234, 345, 456, 567, 678, 789, 8910, 1023, 1134, 1567, 1769)
MRN <-c(55555, 55555, 55555, 66666, 66666, 66666, 77777, 77777, 77777, 88888, 88888, 88888)
Collected <-c("2022-02-05", "2022-02-06", "2022-01-07", "2022-01-08", "2022-01-09", "2022-01-10", "2022-01-11", "2022-02-12", "2022-01-13", "2022-01-04", "2022-01-15", "2022-01-16")
Result <-c("Detected", "Detected", "Detected", "Detected", "Detected","Detected", "Detected", "Detected", "Detected", "Detected", "Detected", "Detected")


df1 <- data.frame(Name, Accession, MRN, Collected, Result)

数据帧 2 (df2) 的数据如下所示

Name <- c("Doe, John","Doe, John","Doe, John", "Doe, Jane", "Doe, Jane","Doe, Jane","Parker, Peter","Parker, Peter","Parker, Peter", "Stark, Tony","Stark, Tony","Stark, Tony")
Accession <- c(123, 234, 345, 456, 567, 678, 789, 8910, 1023, 1134, 1567, 1769)
MRN <-c(55555, 55555, 55555, 66666, 66666, 66666, 77777, 77777, 77777, 88888, 88888, 88888)
Collected <-c("2022-01-22", "2022-01-20", "2022-01-07", "2022-01-28", "2022-01-12", "2022-01-15", "2022-01-17", "2022-01-31", "2022-01-16", "2022-01-20", "2022-01-25", "2022-01-26")
Result <-c("Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive","Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive")


df2 <- data.frame(Name, Accession, MRN, Collected, Result)

我想通过 df2 对 df1 进行子集化,并将收集日期与 df2 中的收集日期相差 +/- 7 天的所有观察结果保留在 df1 中。我的问题是,即使 MRN 重复,我也想要所有观察结果。我希望它看起来像这样

Name            Accession             MRN               Collected        Result
Doe, John       345                  55555              2022-01-07       Detected
Doe, Jane       456                  66666              2022-01-08       Detected
Doe, Jane       567                  66666              2022-01-09       Detected
Doe, Jane       678                  66666              2022-01-10       Detected
Parker, Peter   789                  77777              2022-01-11       Detected
Parker, Peter   1023                 77777              2022-01-13       Detected
Stark, Tony     1567                 88888              2022-01-15       Detected
Stark, Tony     1769                 88888              2022-01-16       Detected

在基于任何观察的 +/- 7 天的最终数据中,Doe、John(123 和 234)、Parker、Peter(8910)和 Stark、Tony(1134)的观察将被排除在外,因为它们不会出现在大体时间。

【问题讨论】:

  • 加入数字 456 不在 +-7 天内,仍然出现在您的预期输出中。那是想要的吗?
  • @AndreWildberg 其中一项观察结果在 +/- 7 天内。我很抱歉,也许我没有说清楚。我想保留任何观察,只要它是从任何实例的收集日期起 +/- 7 天(基于 MRN)。
  • 好的,但是,345 不是在 234 (2022-01-07 - 2022-01-10) 内吗?
  • @AndreWildberg 我已经对 df1 的日期进行了编辑。谢谢!
  • K,我在答案中包含了新数据。

标签: r join dplyr tidyverse subset


【解决方案1】:

使用left_joinfilter 的方法。

library(dplyr)

left_join(df1, df2 %>% select(-Result), c("Name", "Accession", "MRN")) %>% 
  group_by(MRN) %>% 
  filter(sapply(as.Date(Collected.x), function(x) 
    any(abs(x - as.Date(Collected.y)) <= 7))) %>% 
  ungroup() %>% 
  select(-ends_with(".y")) %>% 
  rename(Collected = Collected.x)
# A tibble: 8 × 5
  Name          Accession   MRN Collected  Result  
  <chr>             <dbl> <dbl> <chr>      <chr>   
1 Doe, John           345 55555 2022-01-07 Detected
2 Doe, Jane           456 66666 2022-01-08 Detected
3 Doe, Jane           567 66666 2022-01-09 Detected
4 Doe, Jane           678 66666 2022-01-10 Detected
5 Parker, Peter       789 77777 2022-01-11 Detected
6 Parker, Peter      1023 77777 2022-01-13 Detected
7 Stark, Tony        1567 88888 2022-01-15 Detected
8 Stark, Tony        1769 88888 2022-01-16 Detected

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多