2017-08-29 12 views
0

matches()またはのようなヘルパー関数を逆にして、特定の文字列を含んでいない変数を選択できるようにするにはどうすればよいですか?dplyr :: selectのヘルパー関数をどのように逆にしますか?

たとえば、mtcarsデータフレーム内の文字「m」を持たないすべての列を選択したかったとします。私のような何かやって想像することができます:

mtcars %>% 
    select(!matches("m")) 

をしかし、それはエラーがスローされます:私はそれを反転するヘルパー関数を作成するにはどうすればよい

Error: !matches("m") must resolve to integer column positions, not a logical vector

重要な注意:matches()を使用して一致しない正規表現を書くことが考えられますが、ヘルパー関数の単純さを維持する方法を見つけることに興味があります。実際の「どうやってそのような問題を選ぶのか」を解決するよりも、

+0

良い点 - 意図的に曖昧で、ヘルパー関数や列名だけに汎用性があることを知っておくと便利です。 – crazybilly

答えて

4

、、starts_with()などのヘルパー関数は、インデックス値のベクトルを返します。上記の例では、逆数が必要ない場合、matches("m")は、最初の列名と9番目の列名に "m"が含まれているため、c(1,9)を返します。念頭に置いて

は、私たちがしなければならないすべては、負の機能を作るです:

matches("m")リターンこれらの列の選択を解除しますが、他のすべてを残し c(-1, -9)のベクトルを作る
mtcars %>% 
    select(-matches("m")) 

!、ブールNOTを使用

、元の例に示すように、論理的に整数値を強制し、これに代えてc(1,9)の、あなたがTRUEの両方1,9強制ためc(FALSE, FALSE)で終わるが、その後で反転されます!

これは、Rが上に投げていたエラーを説明しています。select()は、論理値のベクトルではなく、列インデックスに対応する整数のリストを求めています。