2013-08-09 7 views
5

data.frameで2つの列を入れ替えたいとします。私はのような何か行うことができます知っている:総再割当てなしでデータフレームの列の位置を変更する

dd <- dd[c(1:4, 6:5, 7:10)] 

をしかし、私はそれが洗練見つけ、潜在的にゆっくりとしないプログラムに優しい(あなたがlength(dd)を知っている必要があり、およびスワップ列が接近している場合でも、いくつかのケースを持っていますか(?)その値ではない...) データフレーム全体を再割り当てせずに簡単に行う方法はありますか?

​​

[ <-は値だけではなく、属性に関係するので、非常に「不可逆」であることが判明しました。

(dd <- data.frame(A = 1:4, Does = 'really', SO = 'rock')) 
dd[3:2] 
dd[2:3] <- dd[2:1] 
print(dd) 

列名は明らかにひっくり返されていません...

任意のアイデア:だから例えば?私は非常に長いリストに小さなカスタム関数を追加することもできますが、grrrは方法でなければなりません。 ;-)

+2

'data.table' pacakgeを使うと、再割り当てを伴う列の並べ替えを行うことができますが、構文はおそらくhttp-// sの処理よりはるかにクリーンではありませんtackoverflow.com/questions/12232041/how-to-reorder-data-table-columns-without-copying – thelatemail

+0

しかし、 'setcolorder'はcol順を参照によって変更することに注意してください。コピーは作成されていません。だから、* fast *です。 – Arun

+1

10 x 1e6データフレームの列を逆にするには約7msかかります。だから、あなたがこれをやっていない限り、あなたのコードではボトルネックになることはまずありません。スピードではなく表現力について心配する必要があります。 – hadley

答えて

3

それは、単一の機能ではないが、比較的単純な:

dd[replace(seq(dd), 2:3, 3:2)] 

    A SO Does 
1 1 rock really 
2 2 rock really 
3 3 rock really 
4 4 rock really 
+0

これまでのベストソリューション。ありがとう! –

2

この:

dd[,2:3] <- dd[,3:2] 

作品が、あなたにも名を更新する必要があります。

names(dd)[2:3] <- names(dd)[3:2] 
+0

ありがとう、しかし私は私の質問でそれを言及しました、それは私が探しているものではありません。 (私は後で名前を呼ぶことを避けたい) –

関連する問題