按照字符串匹配选择列 - dplyr :: select

117

我有一个数据框("data"),其中包含很多列。其中一些列包含特定的字符串("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)

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


请参考此SO答案,了解多个字符串和匹配项:https://dev59.com/nl4b5IYBdhLWcg3whB-V - agenis
5个回答

172

dplyr世界中,尝试使用:

select(iris,contains("Sepal"))

请参见?select中的 Selection 部分,这里有很多其他辅助函数,如 starts_withends_with 等。


3
请注意,您很容易因试图避免正则表达式而陷入困境,而正则表达式会反噬您,例如:select(iris, contains(".") ) 不确定如何传递 fixed=TRUE 以强制搜索实际的 "." - thelatemail
1
@thelatemail 这感觉像是代码或文档中的疏忽(即我们是否假定 fixed = TRUE 或等效项)。dplyr 仍然很年轻。 - joran
@thelatemail 哎呀!我也是! - joran
6
那对于我的 GitHub 生涯来说,这是一个相当糟糕的开端。很快就要出现“关闭重复项”了! - thelatemail
1
@MattBannert,请查看我提供的解决方案。 - Boern
显示剩余2条评论

80

1
更好的支持正则表达式,自从这个功能被加入。 - Boern
链接现在已经失效。 - pratikpc
2
方便地,还可以使用!matches(...) - Brian D

42

不需要使用select,只需使用[代替

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

让我们尝试使用鸢尾花数据集

>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
@dplyr 是一种药物,即使您可以使用 base 进行操作,标准语法也不如 dplyr 美观/可读性高/易于组合 - 请参见我的回答 - Piotr Migdal

22

根据Piotr Migdal的回复,我想提供一种替代方案,使字符串向量成为可能:

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

利用正则表达式中的“或”运算符(|)。
注意:如果你只需要一个普通的列名向量(而不需要正则表达式的强大功能),请参阅本答案下面的评论(因为它是更简洁的解决方案)。

6
针对已知列名称的向量,使用select(df, one_of(array_of_colnames)) - AlexR

3

或者使用一个包含22个列的DataFrame:

library(plyr) # for baseball dataset.
library(dplyr)

baseball %>% colnames() %>% length()
[1] 22

baseball %>% colnames()
 [1] "id"    "year"  "stint" "team"  "lg"    "g"     "ab"    "r"     "h"     "X2b"   "X3b"   "hr"    "rbi"  
[14] "sb"    "cs"    "bb"    "so"    "ibb"   "hbp"   "sh"    "sf"    "gidp"

您可以使用starts_with(“s”)ends_with(“b”)
> baseball %>% select(starts_with("s")) %>% head(5)
    stint sb so sh sf
4       1  6  1 NA NA # players.columns.str.startswith('p')
44      1  8  0 NA NA
68      1  2  0 NA NA 
99      1  4  0 NA NA
102     1  3  0 NA NA

> baseball %>% select(ends_with("b")) %>% head(5)
     ab X2b X3b sb bb ibb
4   120  11   3  6  2  NA
44  162   9   4  8  4  NA
68   89   3   1  2  2  NA
99  161   5   1  4  3  NA
102 128   3   7  3  1  NA

# contains("g") matches names that contain “g”.
> baseball %>% select(contains("g")) %>% head(5)
    lg  g gidp
4      25   NA
44     32   NA
68     19   NA
99     33   NA
102    29   NA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接