根据字符串匹配选择列-dplyr :: select


80

我有一个包含很多列的数据框(“数据”)。一些列包含某个字符串(“ search_string”)。

如何使用dplyr::select()给我一个仅包含包含字符串的列的子集?

我试过了:

# columns as boolean vector
select(data, grepl("search_string",colnames(data)))

# columns as vector of column names names 
select(data, colnames(data)[grepl("search_string",colnames(data))]) 

他们都不工作。

我知道可以select()接受数值向量替代列,例如:

select(data,5,7,9:20)

但是我不知道如何IDgrepl()表达式中获取列s的数值向量。


另请参
见此

Answers:


111

dplyr世界中,尝试:

select(iris,contains("Sepal"))

请参见在选择部分?select用于许多其他佣工喜欢starts_withends_with等等。


2
请注意,通过尝试避免使用正则表达式,您很容易对此select(iris, contains(".") )fixed=TRUE"."
感到困惑

1
@thelatemail感觉像是代码或文档中的疏忽(即我们假设fixed = TRUE还是等效)。dplyr还很年轻。
joran 2014年

@thelatemail糟糕!我也是!
joran 2014年

6
好吧,那对我的github生涯来说是一个相当la脚的开始。即将关闭“重复复制”!
thelatemail 2014年

1
@MattBannert看到我提供的解决方案
Boern,2016年


28

无需select使用[而只需使用

data[,grepl("search_string", colnames(data))]

让我们尝试使用iris数据集

>iris[,grepl("Sepal", colnames(iris))]
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9

6
@arumbaydplyr是一个让人头疼的问题-即使您可以使用它base,标准语法也不是很好/可读/可组合的-参见我的回答
Piotr Migdal

19

基于Piotr Migdals的响应,我想给出一个替代解决方案,以实现字符串向量的可能性:

myVectorOfStrings <- c("foo", "bar")
matchExpression <- paste(myVectorOfStrings, collapse = "|")
# [1] "foo|bar"
df %>% select(matches(matchExpression))

使用正则表达式OR运算符(|

注意:如果您确实有一个简单的列名向量(并且不需要RegExpression的功能),请参阅此答案下方的注释(因为它是更干净的解决方案)。


5
对于已知列名的向量,请使用select(df, one_of(array_of_colnames))
AlexR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.