web-dev-qa-db-ja.com

データフレームの列を列名で並べ替える

これはおそらく簡単な質問ですが、列をアルファベット順に並べる方法がわかりません。

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

私は達成するために、アルファベット順に列名で列を並べるのが好きです

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

他の人には、自分で定義した順序が必要です:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

私のデータセットは巨大で、10000個の変数があることに注意してください。そのため、プロセスをより自動化する必要があります。

73
John Clark

ordernamesを使用し、それを使用してサブセット化するときに列を順序付けることができます。

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

独自に定義された順序については、名前と順序のマッピングを独自に定義する必要があります。これは、これをどのように行うかによって異なりますが、上記のorderでこれに対応する関数をスワップすると、目的の出力が得られます。

たとえば、 目的の順序を指定するターゲットベクトルに従ってデータフレームの行を順序付ける を参照できます。つまり、ターゲットに対してmatchデータフレームnamesを使用できます。目的の列順序を含むベクトル。

113
James
test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

次の単純な関数の置換を使用して実行できます(ただし、データフレームに多くの列がない場合のみ)。

test <- test[, c("A", "B", "C")]

ほかの人のため:

test <- test[, c("B", "A", "C")]
13
MANOJ KUMAR

誰かがこれをパイプでやりたい場合の必須のdplyr答えです。

test %>% 
    select(sort(names(.)))
13
Andrew Brēza
  test[,sort(names(test))]

列名のソートは簡単に機能します。

4

前面に1つ以上の列のみが必要で、残りの順序を気にしない場合:

require(dplyr)
test %>%
  select(B, everything())
3
Xavier

これが、データセットで同様の問題を達成するために見つけたものです。

最初に、ジェームスが上記したこと、つまり.

test[ , order(names(test))]

次に、dplyrのeverything()関数を使用して、データフレームの先頭にある特定の対象列(たとえば、「D」、「G」、「K」)を移動し、それらの列の後にアルファベット順に並べます。

select(test, D, G, K, everything())

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

0
Brit

もう1つのオプションは、引数numeric = TRUEを指定して、ライブラリstringrからstr_sort()を使用することです

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11

0
demarsylvain

上記の他の構文と似ていますが、学習用です-列名でソートできますか?

sort(colnames(test[1:ncol(test)] ))
0
KNN

したがって、特定の列を最初に表示し、残りをアルファベット順に表示するには、この解決策を提案します。

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
0
Tom Wagstaff