【问题标题】:Conditional filtering in groups using data.table in R使用 R 中的 data.table 进行分组条件过滤
【发布时间】:2021-11-25 16:05:33
【问题描述】:

我有两个数据集,我想先加入,然后根据条件过滤每个组(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 来实现相同的目标,这通常更快?

【问题讨论】:

  • 有趣的问题,但请提供minimal reproducible example,包括预期结果。由于当前编写的问题,尚不清楚哪一列来自哪个data.frame。为了找到聪明的答案,有必要了解全貌,并有一些数据进行测试。

标签: r data.table


【解决方案1】:

无法在没有数据的情况下对此进行测试,但 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)]

【讨论】:

  • 谢谢。不过,我遇到了一个错误,In if (max(end_date) &lt; date) end_date == max(end_date) else date &gt;= ... : the condition has length &gt; 1 and only the first element will be used
  • 尝试将条件包装在anyif(any(max(end_date) &lt; date, na.rm = TRUE))
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2013-08-09
  • 2023-02-08
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多