我有这样的数据:
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,因为这些超出了时间。我想不出办法做到这一点?
答案 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
如果您对每条记录有多个重叠的数据执行此操作,则还需要对行进行重复数据删除