首页 > 解决方案 > 使用 R 中的 data.table 进行分组条件过滤

问题描述

我有两个数据集,我想先加入,然后根据条件过滤每个组(id, code)。对于每个组,如果end_date早于date,我想简单地过滤最新的end_date。否则,我想过滤date两列之间的行,start_date并且end_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通常更快的方法来实现相同的目标?

标签: rdata.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)]

推荐阅读