次のデータフレームがあるとします。
_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()
を使用すると、この方法で位置によって列を選択しようとするためです。
aとfの間のすべての列、および1との間の番号であるラベルが付いたデータフレームを取得できるようにしたい99。 select()
を使用すると、一度に実行できますか?
データ内の「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バージョンのselect
、select_
を使用することです。
dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8"))
列a:fを選択し、colnamesを数値に変換して数値列のインデックスを追加できます。
dd %>%
select(a:f, which(!is.na(as.numeric(colnames(dd)))))