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


83

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


複数の文字列と一致については、次のSO回答も参照してください:stackoverflow.com/q/29018292/3871924
agenis 2016年

回答:


114

dplyrの世界では、試してみてください。

select(iris,contains("Sepal"))

で選択]セクションを参照してください?selectのような数多くの他のヘルパーのためにstarts_withends_withなど、


2
正規表現を回避しようとすると、正規表現が戻ってきて噛み付くので、これに簡単に取り掛かることができることに注意してください。たとえば、実際の検索を強制するためにselect(iris, contains(".") )どのように通過fixed=TRUEするのかわからない"."
thelatemail 2014

1
@thelatemailこれは、コードまたはドキュメントのいずれかで見落としのように感じます(つまり、私たちが想定している、fixed = TRUEまたは同等のものです)。dplyrはまだかなり若いです。
joran 2014

@thelatemailおっと!私はやった!
joran 2014

6
さて、それは私のgithubのキャリアへのかなり不完全なスタートです。「重複として閉じる」が間もなく登場!
thelatemail 2014

1
@MattBannertは私が提供したソリューションを参照してください
Boern 2016


30

代わりに使用する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 2015年

20

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 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.