web-dev-qa-db-ja.com

文字列の一致に基づいて列を選択する-dplyr :: select

たくさんの列を持つデータフレーム(「データ」)があります。一部の列には、特定の文字列( "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()式から列IDsの数値ベクトルを取得する方法がわかりません。

67
Timm S.

dplyrワールド内で、試してください:

select(iris,contains("Sepal"))

?selectstarts_withなど、他の多数のヘルパーについては、ends_withの選択セクションを参照してください。

91
joran

あなたが試すことができます:

select(data, matches("search_string"))

containsよりも一般的です-正規表現を使用できます(例:"one_string|or_the_other")。

その他の例については、 http://rpackages.ianhowson.com/cran/dplyr/man/select.html を参照してください。

47
Piotr Migdal

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
22
Jilber Urbina

Piotr Migdalsの回答に基づいて、文字列のベクトルの可能性を可能にする代替ソリューションを提供したいと思います。

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

正規表現OR演算子(|)を使用する

18
Boern