web-dev-qa-db-ja.com

dplyr:空白を含む列名を選択します

_df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b"
), row.names = c(NA, -3L), class = "data.frame")
_

データは次のようになります

_  a a a b
1   1   2
2   2   3
3   3   4
_

選択する呼び出しに続いて

_select(df, 'a a')
_

与える

_Error in abs(ind[ind < 0]) : 
  non-numeric argument to mathematical function
_

「a」を選択したり、selectを使用してスペースのない名前に変更するにはどうすればよいですか?私は次のアプローチを知っています:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

しかし、大規模なデータセットで作業している場合、インデックス番号または類似の列名を知らなくても正確に一致させるにはどうすればよいですか?

47
Flux

バックティック`を使用して、select変数を使用できます。

select(df, `a a`)
#   a a
# 1   1
# 2   2
# 3   3

ただし、列の名前を変更することが主な目的である場合は、renameパッケージでplyrを使用できます。このパッケージでは、""``の両方を使用できます。

rename(df, replace = c("a a" = "a"))
rename(df, replace = c(`a a` = "a"))

またはbase Rで:

names(df)[names(df) == "a a"] <- "a"

さまざまな引用符の使用に関するより詳細な説明については、?Quotesを参照してください。 「名前と識別子」セクションは、ここで特に重要です。

他の[構文的に無効]の名前は、引用符で囲まれていれば使用できます。推奨される引用符はバックティックです」。

有効な名前については、?make.namesも参照してください。

this postdplyrの名前変更についても参照

55
Henrik

この記事の執筆時点での現在のバージョンであるdplyr 0.5.0の時点で、バックティックに代わるものがいくつかあります。

プログラムで引数を列として選択しようとしていて、paste/sprintfのような名前をバックティックにしたくない場合は、as.nameを組み合わせて使用​​できます。 非標準の評価selectのバージョン(select_):

dplyr::select_(df, as.name("a a"))

dplyr関数の多くには、非標準バージョンがあります。特にselectの場合、選択ヘルパーone_ofと組み合わせて標準バージョンを使用することもできます。ドキュメントについては、?dplyr::select_helpersを参照してください。

dplyr::select(df, dplyr::one_of("a a"))
2
Andy