R语言dplyr按分组日期条件筛选 无需mutate的更优雅实现方法
R dplyr按分组阈值筛选的优雅实现
你完全可以跳过mutate步骤,甚至可以省去左连接操作,以下是两种更简洁的实现方案:
方案1:仅删除冗余mutate步骤(改动最小)
dplyr的filter()本身就支持直接传入逻辑判断表达式,不需要提前生成逻辑列,同时如果不需要保留分组阈值列,可以在筛选后直接删除:
library(dplyr) # 提前统一日期类型,避免字符串比较隐患 max_dates$max_date <- as.Date(max_dates$max_date) desired_df <- df %>% left_join(max_dates, by = 'col_1') %>% filter(date >= max_date) %>% select(-max_date) # 不需要保留阈值列的话加这行即可
方案2:省略左连接,用命名向量匹配阈值
如果不想做表连接,也可以提前把分组阈值转成命名向量,直接在filter中匹配对应分组的阈值,代码更精简:
library(dplyr) # 生成分组阈值命名向量,名称为col_1的取值 max_date_vec <- setNames(as.Date(max_dates$max_date), max_dates$col_1) desired_df <- df %>% filter(date >= max_date_vec[col_1])
补充:如果阈值是从原数据集分组计算得到
如果你的分组阈值不需要从外部表导入,而是直接从df本身分组统计得到(比如每个分组的最大日期),可以直接用分组+筛选的写法,不需要额外的阈值表:
desired_df <- df %>% group_by(col_1) %>% filter(date >= max(date)) %>% # 直接在分组内调用统计函数做判断 ungroup()
内容的提问来源于stack exchange,提问作者alexb523
相关产品推荐
相关产品推荐

