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.

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.


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(.)))

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")]


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())

2

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

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]

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


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)] ))

[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())

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.