使用 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
,其中包含列名称中带有 m
或 ar
的列
【讨论】:
以上是关于使用 dplyr contains() 基于多个字符串选择列的主要内容,如果未能解决你的问题,请参考以下文章
R语言dplyr包为dataframe添加数据列实战( Add Columns):基于mutate()函数添加一个或者多个数据列(尾部添加头部添加条件生成某个具体数据列的前后)
R语言dplyr包连接多个dataframe实战:使用left_join
使用 Spark 将函数中的多个列名传递给 dplyr::distinct()