2013-08-09 23 views
5

Bir data.frame dosyasında iki sütun değiştirmek istiyorum. Ben böyle bir şey yapabileceğini biliyorum: (?)Bir yeniden boyutlandırma olmadan bir veri çerçevesindeki sütun konumlarını değiştirme

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

Ama bulmak o inelegant, potansiyel olarak yavaş ve olmayan bir program dostu (siz takas sütunlar yakınsa bazı durumlarda bile length(dd) biliyorum ve gerekiyorsa veya Bu değere değil ...) Tüm veri çerçevesini yeniden atamadan bunu yapmanın kolay bir yolu var mı? [ <- yalnızca değerleri değil, nitelikleri ile ilgilidir çünkü

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

çok "kayıplı" olduğu ortaya çıktı.

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

sütun adları açıkça çevrilmiş değildir ...

Herhangi fikri: Yani örneğin? Çok uzun bir listeye küçük bir özel işlev ekleyebilirim ama grrr ... bir yol olmalı. ;-)

+2

'data.table' pacakge, sütunların yeniden düzenlenmesinin yeniden sıralanması için yeniden sıralama yapmanıza izin verir, ancak sözdizimi büyük olasılıkla yaptığınız şeyden daha fazla ısınmaz - http: // s tackoverflow.com/questions/12232041/how-to-reorder-data-table-columns-without-copying – thelatemail

+0

Ancak "setcolorder" öğesinin başvuru sırasına göre değiştiğine dikkat edilmelidir. Hiçbir kopya yapılmıyor. Yani, bu * hızlı *. – Arun

+1

10 x 1e6 veri çerçevesindeki sütunları tersine çevirmek yaklaşık 7 ms sürer. Bu yüzden, eğer bu zaman dilimini yapmıyorsanız, kodunuzdaki tıkanıklık olması muhtemel değildir ve süratle değil, süratle ilgili endişelenmeniz gerekir. – hadley

cevap

3

Tek fonksiyonlu değil, ama nispeten basit:

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

Şimdiye kadarki en iyi çözüm. Teşekkürler! –

2

Bu:

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

çalışır, ancak siz de adını güncellemek zorunda:

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

Teşekkürler, ama soruda bahsettim, gerçekten aradığım şey değil. (Daha sonra isimleri aramaktan kaçınmak istiyorum) –

İlgili konular