在 R 中使用 data.table 在组中进行条件过滤
Conditional filtering in groups using data.table in R
我有两个数据集,我想先加入它们,然后根据条件对每个组进行过滤 (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
来实现同样的事情?
无法在没有数据的情况下进行测试,但 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)]
我有两个数据集,我想先加入它们,然后根据条件对每个组进行过滤 (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
来实现同样的事情?
无法在没有数据的情况下进行测试,但 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)]