如何用dplyr更高效筛选指定前缀开头且不含特定字符串的列?
用dplyr实现更简洁高效的列筛选
当然可以!用dplyr的话,我们能把你现在的两步操作简化成更直观的管道式写法,既提升可读性,也能利用dplyr内部的优化来提高效率。这里有两种推荐的实现方式:
方式一:分步筛选(直观易读)
先选出以LW/LB/CW/CB开头的列,再排除包含con.的列:
library(dplyr) tester <- df_ans %>% select(matches("^(LW|LB|CW|CB)"), -matches("con\\."))
matches("^(LW|LB|CW|CB)"):匹配所有以指定前缀开头的列名(^表示字符串开头)-matches("con\\."):去掉列名中包含con.的列(注意.在正则里是通配符,所以要加反斜杠转义)
方式二:单正则匹配(更高效)
利用正则的负向预查,一次匹配就完成“前缀符合+不含指定字符串”的双重条件,避免两次筛选:
tester <- df_ans %>% select(matches("^(LW|LB|CW|CB)(?!.*con\\.)", perl = TRUE))
(?!.*con\\.)是负向预查,意思是“后面不能出现con.这个字符串”- 开启
perl = TRUE才能支持这种正则语法,这种写法只需要一次列名匹配,在数据量较大时效率更高
和原代码的对比
你原来的基础R写法需要两次手动操作列名向量,而dplyr的写法更符合tidyverse的管道式风格,代码逻辑一目了然,同时dplyr的select()函数针对列筛选做了优化,在处理大型数据集时性能表现会更出色。
内容的提问来源于stack exchange,提问作者Parseltongue
相关产品推荐
相关产品推荐

