使用 dplyr contains() 基于多个字符串选择列

Posted

技术标签:

【中文标题】使用 dplyr contains() 基于多个字符串选择列【英文标题】:select columns based on multiple strings with dplyr contains() 【发布时间】:2015-05-15 02:41:37 【问题描述】:

我想使用 regex 表达式根据它们的名称选择多个列。我正在尝试使用 dplyr 包的管道语法来做到这一点。我检查了其他主题,但只找到了关于单个字符串的答案。

使用基础 R:

library(dplyr)    
mtcars[grepl('m|ar', names(mtcars))]
###                      mpg am gear carb
### Mazda RX4           21.0  1    4    4
### Mazda RX4 Wag       21.0  1    4    4

但是它不适用于选择/包含方式:

mtcars %>% select(contains('m|ar'))
### data frame with 0 columns and 32 rows

怎么了?

【问题讨论】:

【参考方案1】:

您可以使用matches

 mtcars %>%
        select(matches('m|ar')) %>%
        head(2)
 #              mpg am gear carb
 #Mazda RX4      21  1    4    4
 #Mazda RX4 Wag  21  1    4    4

根据?select 文档

‘matches(x, ignore.case = TRUE)’:选择所有符合条件的变量 名称匹配正则表达式“x”

虽然contains 使用单个字符串

mtcars %>% 
       select(contains('m'))

【讨论】:

谢谢@akrun,我现在觉得自己很蠢:-)。但是还有一个问题:既然如此,我们为什么还要使用 contains(),如果 matches() 能做同样的事情,甚至更好? @agenis 因为您可能想匹配“.”并且不必考虑如何在正则表达式中对其进行转义 @MichaelBellhouse 在这种情况下,您使用paste 即。 paste(yourvec, collapse="|") 并在 matches 中使用它 akrun,非常感谢。我已经为此做了很多挖掘和试验。一切顺利。 equivalent_for_filter % filter(!grepl(paste(exclude_filter, collapse="|"),variable))【参考方案2】:

你可以使用dplyr包中的contains,如果你给出一个文本选项的向量,像这样:

mtcars %>% 
       select(contains(c("m", "ar"))

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:

您仍然可以使用基础 R 中的grepl()。

df <- mtcars[ , grepl('m|ar', names(mtcars))]

...返回子集数据框 df,其中包含列名称中带有 mar 的列

【讨论】:

以上是关于使用 dplyr contains() 基于多个字符串选择列的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包为dataframe添加数据列实战( Add Columns):基于mutate()函数添加一个或者多个数据列(尾部添加头部添加条件生成某个具体数据列的前后)

R语言dplyr包连接多个dataframe实战:使用left_join

使用 Spark 将函数中的多个列名传递给 dplyr::distinct()

使用 dplyr 对多个变量的所有可能组合进行分组

使用 dplyr::select() 以数字为名称选择多个列

使用 dplyr 或 apply 对多个变量的多个观测值应用计算