web-dev-qa-db-ja.com

名前として数値を使用するdplyr :: select()で複数の列を選択する

次のデータフレームがあるとします。

_a <- runif(10)
dd <- as.data.frame(t(a))
names(dd) <- c("ID", "a", "a2", "b", "b2", "f", "XXX", "1", "4", "8")
_

dplyrには、複数の列を選択するための素晴らしい方法があります。たとえば、列aと列fの間の列を選択するには、次のように使用できます

_dd %>% dplyr::select(a:f)
_

私の問題では、データフレームの最後の部分の列が異なる可能性がありますが、名前には常に1から99までの番号が付けられています。ただし、上記と同じトリックを実行できないようです。

_> dd %>% select(1:99)
Error: Position must be between 0 and n
> dd %>% select("1":"99")
Error: Position must be between 0 and n
_

これは、select()を使用すると、この方法で位置によって列を選択しようとするためです。

afの間のすべての列、および1との間の番号であるラベルが付いたデータフレームを取得できるようにしたい99select()を使用すると、一度に実行できますか?

8
Theodor

データ内の「1」や「8」などの数字で始まる列名は、構文的に有効な名前ではありません(?make.namesを参照)。次に、?Quoutesの「名前と識別子」セクションを参照してください:「他の[構文的に無効]な名前は、引用符で囲まれていれば使用できます。推奨される引用符はバックティックです」。

したがって、無効な列名をバッククォート(`)で囲みます。

dd %>% dplyr::select(a:f, `1`:`8`)

#           a        a2         b        b2          f         1         4         8
# 1 0.2510023 0.4109819 0.6787226 0.4974859 0.01828614 0.7449878 0.1648462 0.5875638

別のオプションは、SEバージョンのselectselect_を使用することです。

dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8"))
10
AlexR

列a:fを選択し、colnamesを数値に変換して数値列のインデックスを追加できます。

dd %>% 
  select(a:f, which(!is.na(as.numeric(colnames(dd)))))
3
zx8754