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

时间:2014-09-18 22:24:26

标签: regex r grep dplyr

我有一个包含大量列的数据框(“数据”)。有些列包含某个字符串(“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)

但我不知道如何从我的ID表达式中获取列grepl()的数字向量。

4 个答案:

答案 0 :(得分:85)

dplyr 世界中,请尝试:

select(iris,contains("Sepal"))

请参阅?select中的选择部分,了解许多其他帮助,例如starts_withends_with等。

答案 1 :(得分:42)

您可以尝试:

select(data, matches("search_string"))

它比contains更通用 - 您可以使用正则表达式(例如"one_string|or_the_other")。

有关更多示例,请参阅:http://rpackages.ianhowson.com/cran/dplyr/man/select.html

答案 2 :(得分:22)

无需使用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

答案 3 :(得分:17)

根据Piotr Migdals的回复,我想提供一个替代解决方案,以便能够提供字符串向量:

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

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