削除するデータフレームとそのデータフレーム内の列のリストがあります。 iris
データセットを例として使用してみましょう。 Sepal.Length
とSepal.Width
を削除し、残りの列のみを使用したいと思います。 select
パッケージのdplyr
またはselect_
を使用してこれを行うにはどうすればよいですか?
これまでに試したことは次のとおりです。
drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)
-drop.colsのエラー:単項演算子への無効な引数
iris %>% select_(.dots = -drop.cols)
-drop.colsのエラー:単項演算子への無効な引数
iris %>% select(!drop.cols)
!drop.colsのエラー:無効な引数タイプ
iris %>% select_(.dots = !drop.cols)
!drop.colsのエラー:無効な引数タイプ
これらは既に存在するはずの非常に便利な操作のように見えるので、明らかな何かを見逃しているように感じます。 Githubで、誰かが 同様の問題 を投稿し、Hadleyは「負のインデックス付け」を使用するように言った。それは私が試したものだと思いますが、役に立ちません。助言がありますか?
Select_varsのヘルプを確認してください。これにより、これを使用する方法に関する追加のアイデアが得られます。
あなたの場合:
iris %>% select(-one_of(drop.cols))
また試してください
## Notice the lack of quotes
iris %>% select (-c(Sepal.Length, Sepal.Width))
select(-one_of(drop.cols))
以外にも、select()
を使用して列をドロップするためのいくつかのオプションがあります。特定の列名をすべて定義する必要はありません(dplyr starwarsサンプルデータを使用して列名をさらに変更します)。
starwars %>%
select(-(name:mass)) %>% # the range of columns from 'name' to 'mass'
select(-contains('color')) %>% # any column name that contains 'color'
select(-starts_with('bi')) %>% # any column name that starts with 'bi'
select(-ends_with('er')) %>% # any column name that ends with 'er'
select(-matches('^f.+s$')) %>% # any column name matching the regex pattern
select_if(~!is.list(.)) %>% # not by column name but by data type
head(2)
# A tibble: 2 x 2
homeworld species
<chr> <chr>
1 Tatooine Human
2 Tatooine Droid
select()
関数はdplyrパッケージとMASSパッケージの両方で使用されるため、MASSがロードされるとselect()が正しく機能しない可能性があるため、注意してください。ロードされているパッケージを調べるには、sessionInfo()
と入力し、「その他の添付パッケージ:」セクションで探します。ロードされている場合は、detach( "package:MASS", unload = TRUE )
と入力すると、select()
関数が再び機能するはずです。
我々は試すことができます
iris %>%
select_(.dots= setdiff(names(.),drop.cols))
別の方法は、不要な列をNULL
に変更することです。これにより、埋め込み括弧が回避されます。
head(iris,2) %>% mutate_at(drop.cols, ~NULL)
# Petal.Length Petal.Width Species
# 1 1.4 0.2 setosa
# 2 1.4 0.2 setosa
列名に特殊文字が含まれている場合、select
またはselect_
が期待どおりに機能しない場合があります。 "."
を使用するdplyr
のこのプロパティ。質問のデータセットを参照するには、次の行を使用してこの問題を解決できます。
drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% .[,setdiff(names(.),drop.cols)]