R中是否有方法可在filter过滤行时仅保留过滤操作用到的列
dplyr 的 filter() 函数本身没有内置类似 mutate() 的 .keep 参数,可通过以下两种方式实现「仅保留过滤操作用到的列」的需求:
- 方法1:手动指定过滤用列(适合过滤逻辑简单、用到的列较少的场景)
先通过select()选中过滤要用到的列,再执行过滤操作即可,示例代码如下:
library(dplyr) df <- tibble(x = c(1,2,3), y = c(2,1,4), a = 10:12, b = 12:10) # 过滤条件为x>1、y<4,仅保留用到的x、y列 df %>% select(x, y) %>% filter(x > 1, y < 4)
运行输出:
# A tibble: 2 × 2 x y <dbl> <dbl> 1 2 1 2 3 4
- 方法2:自定义函数自动识别过滤用列(适合过滤逻辑复杂、不想手动罗列变量的场景)
借助 rlang 工具提取过滤条件中用到的变量,自动完成选列+过滤操作,示例代码如下:
library(dplyr) library(rlang) library(purrr) # 自定义支持仅保留过滤用列的函数 filter_keep_used <- function(.data, ...) { # 提取所有过滤条件表达式 filter_quos <- enquos(...) # 提取表达式中用到的所有数据列名 used_cols <- unique(unlist(map(filter_quos, all.vars))) # 先选列再过滤 .data %>% select(all_of(used_cols)) %>% filter(!!!filter_quos) } # 调用测试,无需手动指定要保留的列 df %>% filter_keep_used(x > 1, y < 4)
运行输出和方法1完全一致,只会返回过滤用到的x、y两列,不会保留a、b等未参与过滤的列。
内容的提问来源于stack exchange,提问作者Md Ahsanul Himel
相关产品推荐
相关产品推荐

