web-dev-qa-db-ja.com

R dplyr:複数の列をドロップします

削除するデータフレームとそのデータフレーム内の列のリストがあります。 irisデータセットを例として使用してみましょう。 Sepal.LengthSepal.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は「負のインデックス付け」を使用するように言った。それは私が試したものだと思いますが、役に立ちません。助言がありますか?

61

Select_varsのヘルプを確認してください。これにより、これを使用する方法に関する追加のアイデアが得られます。

あなたの場合:

iris %>% select(-one_of(drop.cols))
100
phiver

また試してください

## Notice the lack of quotes
iris %>% select (-c(Sepal.Length, Sepal.Width))
47

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 
19
sbha

select()関数はdplyrパッケージとMASSパッケージの両方で使用されるため、MASSがロードされるとselect()が正しく機能しない可能性があるため、注意してください。ロードされているパッケージを調べるには、sessionInfo()と入力し、「その他の添付パッケージ:」セクションで探します。ロードされている場合は、detach( "package:MASS", unload = TRUE )と入力すると、select()関数が再び機能するはずです。

5
Durand Sinclair

我々は試すことができます

iris %>% 
      select_(.dots= setdiff(names(.),drop.cols))
5
akrun

別の方法は、不要な列を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
1

列名に特殊文字が含まれている場合、selectまたはselect_が期待どおりに機能しない場合があります。 "."を使用するdplyrのこのプロパティ。質問のデータセットを参照するには、次の行を使用してこの問題を解決できます。

drop.cols <- c('Sepal.Length', 'Sepal.Width')
  iris %>% .[,setdiff(names(.),drop.cols)]