2013-08-09 15 views
5

Chcę zamienić dwie kolumny w data.frame. Wiem, że mógłbym zrobić coś takiego: (?)Zmiana położenia kolumn w ramce danych bez całkowitej zmiany przypisania

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

Ale uważam, że to nieeleganckie, potencjalnie powolny i nie programem w obsłudze (trzeba wiedzieć length(dd), a nawet kilka przypadków, gdy zamienione kolumny są zbliżone lub nie do tej wartości ...) Czy istnieje prosty sposób, aby to zrobić bez ponownego przypisywania całej ramki danych?

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

okazuje się być bardzo „stratny”, ponieważ [ <- dotyczy jedynie wartości, a nie jej atrybuty. Tak na przykład:

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

Nazwy kolumn nie są oczywiście odwrócone ...

jakiś pomysł? Mogę również dodać małą niestandardową funkcję do mojej bardzo długiej listy, ale grrr ... powinien być sposobem. ;-)

+2

Pakiet 'data.table' pozwala na zmianę kolejności kolumn bez ponownego przypisywania, ale składnia prawdopodobnie nie jest dużo czystsza niż to, co robisz - http: // s tackoverflow.com/questions/12232041/how-to-reorder-data-table-columns- without -copying – thelatemail

+0

Należy jednak zauważyć, że 'setcolorder' zmienia kolejność kolorów przez odniesienie. Nie są wykonywane żadne kopie. Jest to * szybkie *. – Arun

+1

Przejmowanie kolumn w ramce danych 10 x 1e6 trwa około 7 ms. Więc jeśli nie robisz tego przez cały czas, to raczej nie będzie to wąskie gardło w twoim kodzie, i powinieneś martwić się ekspresywnością, a nie szybkością. – hadley

Odpowiedz

3

To nie jest jedna funkcja, ale stosunkowo prosty:

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

Najlepsze rozwiązanie do tej pory. Dzięki! –

2

następująco:

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

prace, ale trzeba aktualizować nazwy, a także:

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

Dzięki, ale wspomniałem o tym w moim pytaniu, to naprawdę nie jest to, czego szukam. (Chciałbym uniknąć późniejszego wywoływania nazw). –

Powiązane problemy