如何优化magrittr管道代码,实现更优雅可读的列类型筛选?
优化magrittr管道筛选数值/整数列的写法
我完全理解你想要精简管道代码、去掉中间变量的需求,你的思路其实已经很接近了!下面给你几种既简洁又易读的解决方案:
1. 修正你尝试的%$%写法
你之前的代码几乎正确,可能是没确保加载magrittr包,或者可以省略多余的which()(逻辑向量直接用于索引更简洁)。调整后可以正常运行:
library(magrittr) DF <- data.frame(a=letters[1:10], b=1L:10L, c=1.01:1.10, d=rep(TRUE,10), e=10L:1L) # 修正后的%$%写法 lapply(DF, class) %>% unlist %$% .[. %in% c("integer", "numeric")]
%$%操作符的作用是把左侧管道的结果(这里是unlist后的类向量)作为上下文,让你可以用.直接指代它,这样就完全去掉了中间变量cols。
2. 用magrittr::keep更直观筛选
magrittr内置的keep函数专门用来保留符合条件的元素,搭配管道会更贴合语义:
# 直接筛选符合条件的列,再取列名 DF %>% keep(~ class(.) %in% c("integer", "numeric")) %>% names()
这种写法更易读——一眼就能看出是“保留DF中类为整数/数值的列,然后取它们的名字”。
3. 结合tidyverse工具(如果常用的话)
如果你已经在使用tidyverse生态,dplyr::select配合where会是最直观的写法:
library(dplyr) DF %>% select(where(~ class(.) %in% c("integer", "numeric"))) %>% names()
或者用purrr来处理类向量:
library(purrr) DF %>% map_chr(class) %>% keep(~ .x %in% c("integer", "numeric"))
这些写法都能达到你想要的效果,而且比重复调用lapply和unlist要优雅得多。
内容的提问来源于stack exchange,提问作者Grec001
相关产品推荐
相关产品推荐

