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


93

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

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個の変数があることに注意してください。したがって、プロセスをより自動化する必要があります。

回答:


137

でを使用orderし、namesサブセット化するときにそれを使用して列を並べ替えることができます。

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、目的の列の順序を含むターゲットベクトルに対してデータフレームを作成できます。


3
詳細に説明すると、test [、c(2,3,1)]またはtest [、c( 'A'、 'B'、 'C​​')]はA、B、C列の順序を生成します。「[」演算子は、何をしたいのかを理解するのに非常に賢いです。
Carl Witthoft 2011

2
ありがとう、私は提供された助けを借りて2番目の質問を理解しました。myorder = c( "B"、 "A"、 "C")、test [、myorder]
ジョンクラーク

私が望む方法で列を並べ替える方法はありますか(CABなど)?
TYZ 2014

data.frameがリストであるという事実を利用して、それをより単純にすることができます:: test[ order(names(test)) ]
ctbrown 2016

1
@nacoなし、ソースを読んでくださいcolnames:それは結局。を要求namesすることになりdata.frameます。
ジェームズ

27

dplyr誰かがパイプでこれをしたい場合の義務的な答えはここにあります。

test %>% 
    select(sort(names(.)))

4
私にとって、最初に必要な変数を選択するのは簡単なので、これはうまくいきました。元DFへのこだわり: test%>%select(b,sort(names(.)))「B、C」としてそれを置く
Silentdevildoll

@Silentdevildollそれはクールなアプリケーションです!私はそれを考えていませんでした。
アンドリューBrēza

14
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")]


4

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

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

2

したがって、特定の列を最初に表示し、次に残りをアルファベット順に表示するには、次のソリューションを提案します。

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

複数の列を最初にしたい場合は、どうしますか?
Maksym Moroz

2

別のオプションは、引数を指定して、str_sort()ライブラリstringrから使用することnumeric = TRUEです。これにより、アルファベットだけでなく数字を含む列が正しく並べ替えられます。

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

# [1] V1 V3 V11


1

上記の他の構文と似ていますが、学習用です-列名で並べ替えることはできますか?

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

ここで[1:ncol(test)]は何もしていませんsort(colnames(test))。書くのに長い方法です。
グレゴールトーマス

0

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

まず、ジェームズが上で述べたことを行います。

test[ , order(names(test))]

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.