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

Tim*_* S. 70 regex grep r 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))]) 
Run Code Online (Sandbox Code Playgroud)

它们都不起作用.

我知道select()接受数字向量作为列的替代,例如:

select(data,5,7,9:20)
Run Code Online (Sandbox Code Playgroud)

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

jor*_*ran 92

dplyr世界中,尝试:

select(iris,contains("Sepal"))
Run Code Online (Sandbox Code Playgroud)

有关?select许多其他帮助者starts_with,请参阅选择部分,如ends_with,等.

  • 嗯,那对我的github职业来说是一个相当蹩脚的开始.即将复制'即将复制'! (6认同)
  • 请注意,你可以很容易地解决这个问题,因为试图避免使用正则表达式,正则表达式会回来咬你,例如:`select(iris,contains("."))`不确定你应该如何通过`fixed = TRUE`强制搜索实际的""."` (2认同)

Pio*_*dal 48

你可以试试:

select(data, matches("search_string"))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 方便的话,还可以使用 `!matches(...)` (2认同)

Jil*_*ina 22

不需要select仅使用[而是使用

data[,grepl("search_string", colnames(data))]
Run Code Online (Sandbox Code Playgroud)

让我们试试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
Run Code Online (Sandbox Code Playgroud)

  • @arumbay`dplyr`是一个panceum - 即使你可以用`base`来做,标准语法也不那么好/可读/可组合 - 请参阅[我的回答](http://stackoverflow.com/a/30153441/ 907575). (4认同)

Boe*_*ern 18

基于Piotr Migdals响应,我想提供一个替代解决方案,支持字符串向量的可能性:

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

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

  • 对于已知列名的向量,请使用`select(df,one_of(array_of_colnames))` (4认同)