Sortuj kolumny ramki danych według nazwy kolumny

93

To prawdopodobnie proste pytanie, ale nie wiem, jak uporządkować kolumny alfabetycznie.

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

Lubię porządkować kolumny według nazw kolumn alfabetycznie, aby osiągnąć

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Dla innych chcę mieć własne zdefiniowane zamówienie:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Zwróć uwagę, że moje zbiory danych są ogromne i zawierają 10000 zmiennych. Dlatego proces musi być bardziej zautomatyzowany.

John Clark
źródło

Odpowiedzi:

137

Możesz użyć orderna namesi użyć tego, aby uporządkować kolumny podczas podzestawiania:

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

Dla własnego zdefiniowanego porządku musisz zdefiniować własne przypisanie nazw do zamówienia. Zależałoby to od tego, jak chciałbyś to zrobić, ale zamiana dowolnej funkcji na tę orderpowyżej powinna dać pożądany wynik.

Możesz na przykład rzucić okiem na Porządkowanie wierszy ramki danych zgodnie z wektorem docelowym, który określa żądaną kolejność , tj. Możesz matchporównać ramkę danych namesz wektorem docelowym zawierającym żądaną kolejność kolumn.

James
źródło
3
Aby rozwinąć, test [, c (2,3,1)] lub test [, c ('A', 'B', 'C')] da kolejność kolumn A, B, C. Operator „[” jest bardzo sprytny w określaniu, co chcesz zrobić.
Carl Witthoft,
2
dziękuję, rozwiązałem drugie pytanie dzięki udzielonej pomocy; myorder = c („B”, „A”, „C”), test [, myorder]
John Clark,
Czy istnieje sposób na sortowanie kolumn w wybrany przeze mnie sposób (np. CAB)?
TYZ
Możesz wykorzystać fakt, że data.frame to lista i uprościć to :: test[ order(names(test)) ]
ctbrown
1
@naco Brak, przeczytaj źródło colnames: kończy się to wezwaniem namesdo data.frame.
James,
27

Oto obowiązkowa dplyrodpowiedź na wypadek, gdyby ktoś chciał to zrobić z fajką.

test %>% 
    select(sort(names(.)))
Andrew Brēza
źródło
4
Dla mnie to działało dobrze, ponieważ łatwo jest najpierw wybrać zmienne, które chcę. Trzymanie się oryginalnego df: test%>%select(b,sort(names(.)))umieści go jako „b, a, c”
Silentdevildoll
@Silentdevildoll to fajna aplikacja! Nie pomyślałem o tym.
Andrew 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))

Można wykonać prostą następującą zamianę funkcji (ale tylko wtedy, gdy ramka danych nie ma wielu kolumn):

test <- test[, c("A", "B", "C")]

dla innych:

test <- test[, c("B", "A", "C")]
MANOJ KUMAR
źródło
6
  test[,sort(names(test))]

sortowanie według nazw kolumn może działać łatwo.

Shalini Baranwal
źródło
4

Jeśli chcesz tylko jedną lub więcej kolumn z przodu i nie obchodzi Cię kolejność pozostałych:

require(dplyr)
test %>%
  select(B, everything())
Xavier Jiménez Albán
źródło
2

Aby konkretna kolumna była pierwsza, a reszta alfabetycznie, zaproponowałbym takie rozwiązanie:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
Tom Wagstaff
źródło
a jeśli chcesz, aby więcej niż jedna kolumna była pierwsza, to co?
Maksym Moroz
2

Alternatywną opcją jest użycie str_sort()z biblioteki stringr z argumentem numeric = TRUE. Spowoduje to prawidłowe uporządkowanie kolumn zawierających liczby nie tylko alfabetycznie :

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

# [1] V1 V3 V11

demarsylvain
źródło
1

Podobna do innej składni powyżej, ale do nauki - czy możesz sortować według nazw kolumn?

sort(colnames(test[1:ncol(test)] ))
KNN
źródło
[1:ncol(test)]Nie robi nic tutaj, to tylko sposób pisać dłużej sort(colnames(test)).
Gregor Thomas
0

Oto, co odkryłem, aby osiągnąć podobny problem z moim zestawem danych.

Najpierw zrób to, o czym James wspomniał powyżej, tj

test[ , order(names(test))]

Po drugie, użyj funkcji Everything () w dplyr, aby przesunąć określone kolumny (np. „D”, „G”, „K”) na początek ramki danych, umieszczając po nich kolumny uporządkowane alfabetycznie.

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

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

Brit
źródło