过滤表用于与另一个案例R重叠日期的案例

时间:2018-01-12 16:30:50

标签: r dplyr lubridate

我有这样的数据:

Sample 1    04/01/18   01/02/18
Sample 2    01/01/18   05/01/18
Sample 4    01/01/16   01/02/16

我想要的输出仅包含样本1和样本2,因为这些超出了时间。我想不出办法做到这一点?

1 个答案:

答案 0 :(得分:0)

这是一种方法。将数据合并到自身,仅保留日期重叠且ID不匹配的行

首先创建数据

sample = c('Sample 1', 'Sample 2', 'Sample 4')
start_date = c('04/01/18', '01/01/18', '01/01/16')
end_date = c('01/02/18', '05/01/18', '01/02/16')
df = data.frame(sample, start_date, end_date)
df

sample     start_date  end_date
Sample 1   04/01/18    01/02/18
Sample 2   01/01/18    05/01/18
Sample 4   01/01/16    01/02/16

接下来,将字符串转换为日期,这样我们就可以进行日期比较

df = transform(df, 
    end_date = as.Date(df$end_date, "%m/%d/%y"),
    start_date = as.Date(df$start_date, "%m/%d/%y")
)

最后一步是将数据合并到自身的副本中。为此,我添加一个名为'dummy'的字段进行合并,这将创建数据的笛卡尔积。为了滤除不匹配,我只保留样本ID不同且日期重叠的位置。 Here是对逻辑的良好讨论。最后,我通过删除额外的列并将名称重置为原始值

来进行一些清理
df %>% 
    mutate(dummy=TRUE) %>% 
    left_join(df %>% mutate(dummy=TRUE), by='dummy') %>%
    filter(start_date.x < end_date.y, end_date.x > start_date.y, sample.x!=sample.y) %>%
    select(grep('.x$', names(.)))  %>% 
    setNames(gsub('.x$','',names(.)))

sample     start_date   end_date
Sample 1   2018-04-01   2018-01-02
Sample 2   2018-01-01   2018-05-01

如果您对每条记录有多个重叠的数据执行此操作,则还需要对行进行重复数据删除