在 R 中使用 data.table 在组中进行条件过滤

Conditional filtering in groups using data.table in R

我有两个数据集,我想先加入它们,然后根据条件对每个组进行过滤 (id, code)。对于每个组,如果 end_date 早于 date,我想简单地过滤最新的 end_date。否则,我想过滤 date 位于两列 start_dateend_date 之间的行。

我使用 dplyr 对此进行了编码并且它有效 - 见下文。

left_join(df, df_match, by='id') %>% 
group_by(id, code) %>%
mutate(is.max = max(end_date) < date) %>%
filter(case_when(
  is.max == T ~ end_date == max(end_date),
  is.max == F ~ date >= start_date & date <= end_date
))

但是,对于我的 1+ 百万行数据集,此代码非常慢。我很好奇是否可以使用通常更快的 data.table 来实现同样的事情?

无法在没有数据的情况下进行测试,但 data.table dplyr 代码的翻译将是 -

library(data.table)

setDT(df)
setDT(df_match)

res <- merge(df, df_match, by = 'id')

res[, .SD[if(max(end_date) < date) end_date == max(end_date) else 
  date >= start_date & date <= end_date],  .(id, code)]