r - 使用 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
通常更快的方法来实现相同的目标?
解决方案
没有数据就无法对此进行测试,但是代码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)]
推荐阅读
- python - 如何对热图进行排序以显示最高相关性?
- reactjs - React 测试库 - 屏幕调试提供与浏览器不同的输出
- php - 无法使用 php 插入 MySQL 数据库
- angular - 如何更改角垫扩展面板方向
- electron - 如何检查电子中是否按下了某个键?
- reactjs - 无法使用 Formik 在 FieldArray 中设置FieldValue
- reactjs - 在 react-bootstrap 中验证 select 类型的输入
- javascript - 多个具有相同名称的命名捕获组
- dependency-injection - 使用 autofac 解决在不同项目中注册的组件的依赖关系
- oauth - In OAuth2, is the /introspect endpoint meant for the OAuth Client to call, or the OAuth Resource Server to call?