如何用dplyr更直接地过滤多键分组中的指定分组?
问题描述
我需要实现这样的操作:根据独立数据框定义的分组键,从目标数据框中删除对应分组的行。现有代码如下,虽然能实现需求,但想知道dplyr有没有更直接的方法。实际场景中我有多个需要单独过滤的数据框,每个数据框对应的待删除分组键都由单独的数据框定义。
现有实现代码:
set.seed(123) df <- tibble( key1 = sample(5, 100, replace = TRUE), key2 = sample(5, 100, replace = TRUE), val = rnorm(100) ) |> group_by(key1, key2) keysToDrop <- tibble( key1 = c(5, 2), key2 = c(3, 2) ) df |> left_join(keysToDrop |> mutate(dropMe = TRUE), by = c("key1", "key2")) |> filter(is.na(dropMe))
更直接的解决方案
当然有更简洁的方法——使用dplyr::anti_join()。这个函数的作用就是返回主数据框中存在,但在指定的对比数据框中不存在的行,完全匹配你“删除对应分组”的需求,不需要额外添加标记列和过滤步骤。
改写后的代码:
set.seed(123) df <- tibble( key1 = sample(5, 100, replace = TRUE), key2 = sample(5, 100, replace = TRUE), val = rnorm(100) ) |> group_by(key1, key2) keysToDrop <- tibble( key1 = c(5, 2), key2 = c(3, 2) ) # 直接用anti_join实现过滤 df |> anti_join(keysToDrop, by = c("key1", "key2"))
针对你有多个数据框需要单独过滤的场景,只需要对每个数据框分别调用anti_join,传入对应的待删除键数据框即可,逻辑清晰且代码更紧凑。
内容的提问来源于stack exchange,提问作者Chechy Levas
相关产品推荐
相关产品推荐

