2017-11-08 8 views
1

データフレームを列名で並べ替えるときに、私はいくつかの奇妙な振る舞いを観察しています。基本的に、データフレームに列が1つしかない場合は、列の名前が失われますが、列が複数ある場合は発生しません。このサンプルコードである:データフレームをR列で並べる

df <- data.frame(c("1", "2", "3"), c("4", "5", "6"), c("7", "8", "9")) 
colnames(df) <- c("A", "C", "B") 
df <- data.frame(df[,order(colnames(df))]) 
print(colnames(df)) 


df <- data.frame(c("1", "2", "3")) 
colnames(df) <- c("A") 
df <- data.frame(df[,order(colnames(df))]) 
print(colnames(df)) 

コード、データフレームdfの最初の部分で、その列を保持が、第2の部分では、カラム名を失います。

明らかに1つの列しかない場合は、列の数を確認して名前を戻すことができますが、悪い習慣のように聞こえることは明らかです。

問題を解決する方法を知っている人はいますか?

+7

良い古い 'ドロップ'問題。 –

+4

この場合のより良い方法は、リスト構文を使用することです: 'df [order(colname(df))]' 'df [order(colnames(df)]]は単一の列data.frameのインスタンス内のリスト構造を削除しますが、リスト構造(および関連する名前)は保持します。 – lmo

答えて

0

かわりdata.frametibbleを使用することができます。

library(tibble) 
df <- tibble(c("1", "2", "3"), c("4", "5", "6"), c("7", "8", "9")) 
colnames(df) <- c("A", "C", "B") 
df <- df[,order(colnames(df))] 
print(colnames(df)) 


df <- tibble(c("1", "2", "3")) 
colnames(df) <- c("A") 
df <- df[,order(colnames(df))] 
print(colnames(df)) 
+2

誰もがパッケージをインストールし、そのような簡単な作業のためにデータ構造を変更すべきですか? –

+0

それは本当です。しかし、私がしているようにいつもあなたがタブルを使うなら、あなたはこの問題を抱えていません。しかし、おそらく他の人たちの代わりに;-) – Tino

+1

この場合、 'data.frame()'はもう必要ありません、 'df < - df [、order(colnames(df))]'はうまく動作します – ANG

0

一つでも最初のコメントでの列アンドレElricoの

df %>% select_(.dots = sort(colnames(df))) 
0

Coutesyを注文するために選択し使用することができ、最もまっすぐ進むソリューションは思わドロップを使用する:

data.frame(df[,order(colnames(df)),drop=F]) 
関連する問題