R biedt verschillende manieren om data te sorteren in oplopende of aflopende volgorde; data-analisten en data scientists gebruiken order(), sort() en pakketten zoals dplyr om te sorteren afhankelijk van de structuur van de data.
TL;DR
- Gebruik
sort()om een vector direct te sorteren en de gesorteerde waarden terug te krijgen - Gebruik
order()om de indexen te krijgen die een vector zouden sorteren—ideaal voor het sorteren van data frames - Gebruik
dplyr::arrange()voor een moderne, leesbare aanpak om data frames te sorteren - Ga om met NA-waarden met de parameter
na.last(TRUE zet NA’s achteraan, FALSE vooraan) - Sorteer in aflopende volgorde met
decreasing = TRUEof door een minteken te gebruiken
order() kan vectors en matrices sorteren, en ook een data frame kan met behulp hiervan in oplopende en aflopende volgorde gesorteerd worden, zoals te zien is in de laatste sectie van deze tutorial.
Syntax of order()
The sort() function
Voordat we in order() duiken, kijken we naar de eenvoudigere functie sort(). Terwijl order() indexen teruggeeft, geeft sort() direct de gesorteerde waarden terug:
# Create a vector
values <- c(4, 12, 6, 7, 2, 9, 5)
# sort() returns the sorted values directly
sort(values)
[1] 2 4 5 6 7 9 12
Het belangrijkste verschil is dat sort() je de daadwerkelijke gesorteerde waarden geeft, terwijl order() de posities teruggeeft. Daardoor is order() handiger voor het sorteren van data frames, zoals we later zullen zien.
Syntax of order()
De syntax van order() staat hieronder:
order(x, decreasing = TRUE or FALSE, na.last = TRUE or FALSE, method = c("auto", "shell", "quick", "radix"))
De argumenten van order() betekenen het volgende:
- x: data frames, matrices of vectors
- decreasing: booleaanse waarde; TRUE sorteert aflopend, FALSE sorteert oplopend.
- na.last: booleaanse waarde; TRUE zet NA-indexen achteraan, FALSE zet ze vooraan.
- method: te gebruiken sorteermethode.
order() in R
Laten we een voorbeeld bekijken van order() in actie.
De code hieronder maakt een vector y met een lijst getallen. Ik gebruik order(y) om de indexen te krijgen die deze getallen zouden sorteren.
y <- c(4, 12, 6, 7, 2, 9, 5)
order(y)
Bovenstaande code geeft de volgende output:
5 1 7 3 4 6 2
Hier sorteert order() de gegeven getallen op basis van hun index in oplopende volgorde. Omdat 2 het kleinst is, met index vijf, en 4 index 1 heeft, gaat het proces op dezelfde manier verder.
y <- c(4, 12, 6, 7, 2, 9, 5)
y[order(y)]
Bovenstaande code geeft de volgende output:
2 4 5 6 7 9 12
Hier wordt geïndexeerd met de volgorde zodat de werkelijke waarden in oplopende volgorde worden afgedrukt. De waarden worden geordend volgens de index met order() en daarna wordt elke waarde benaderd met y[some-value].
Een vector sorteren met verschillende parameters in order()
Laten we een voorbeeld bekijken waarin de datasets de waarde als symbool NA (Not available) bevatten.
order(x,na.last=TRUE)
x <- c(8, 2, 4, 1, -4, NA, 46, 8, 9, 5, 3)
order(x, na.last = TRUE)
Bovenstaande code geeft de volgende output:
5 4 2 11 3 10 1 8 9 7 6
Hier zal order() ook de gegeven lijst met getallen sorteren op basis van hun index in oplopende volgorde. Omdat NA aanwezig is, wordt de index daarvan als laatste geplaatst; 6 komt dus achteraan vanwege na.last=TRUE.
order(x,na.last=FALSE)
order(x, na.last = FALSE)
Bovenstaande code geeft de volgende output:
6 5 4 2 11 3 10 1 8 9 7
Hier zal order() ook de gegeven lijst met getallen sorteren op basis van hun index in oplopende volgorde. Omdat NA aanwezig is, wordt de index daarvan, 6, als eerste geplaatst vanwege na.last=FALSE.
order(x,decreasing=TRUE,na.last=TRUE)
order(x, decreasing = TRUE, na.last = TRUE)
Bovenstaande code geeft de volgende output:
7 9 1 8 10 3 11 2 4 5 6
Hier sorteert order() de lijst met getallen op basis van hun index in aflopende volgorde vanwege decreasing=TRUE: 46, de grootste, staat op index 7 en de andere waarden worden in aflopende volgorde gerangschikt. Omdat NA aanwezig is, wordt index 6 als laatste geplaatst vanwege na.last=TRUE.
order(x,decreasing=FALSE,na.last=FALSE)
order(x, decreasing = FALSE, na.last = FALSE)
Bovenstaande code geeft de volgende output:
6 5 4 2 11 3 10 1 8 9 7
Hier is NA aanwezig, waarvan de index 6 als eerste wordt geplaatst vanwege na.last=FALSE. order() zal de lijst met getallen sorteren op basis van hun index in oplopende volgorde vanwege decreasing=FALSE: -4, de kleinste, staat op index 5 en de overige waarden worden oplopend gerangschikt.
Begin gratis met R leren
R voor gevorderden
Een dataframe sorteren met order()
Laten we een data frame maken met een populatiewaarde van 10. De variabele gender bestaat uit vectorwaarden 'male' en 'female' waarbij 10 steekproefwaarden kunnen worden verkregen met behulp van sample(), terwijl replace = TRUE alleen unieke waarden zal genereren. Evenzo bestaat age uit waarden van 25 tot 75, samen met een degree met mogelijke waarden c("MA," "ME," "BE," "BSCS"), die opnieuw unieke waarden zal genereren.
Taak: Sorteer de gegeven data in oplopende volgorde op basis van de leeftijd van de populatie.
Opmerking: De voorbeelddata kan afwijken wanneer je dit lokaal probeert, omdat elke keer dat je de code draait er een uniek dataframe wordt gemaakt.
population <- 10
gender <- sample(c("male", "female"), population, replace = TRUE)
age <- sample(25:75, population, replace = TRUE)
degree <- sample(c("MA", "ME", "BE", "BSCS"), population, replace = TRUE)
final_data <- data.frame(gender = gender, age = age, degree = degree)
final_data
| gender | age | degree |
|---|---|---|
| male | 40 | MA |
| female | 57 | BSCS |
| male | 66 | BE |
| female | 61 | BSCS |
| female | 48 | MA |
| male | 25 | MA |
| female | 49 | BE |
| male | 52 | ME |
| female | 57 | MA |
| female | 35 | MA |
Bovenstaande code geeft de volgende output, die een nieuw aangemaakt dataframe laat zien.
gender age degree
male 40 MA
female 57 BSCS
male 66 BE
female 61 BSCS
female 48 MA
male 25 MA
female 49 BE
male 52 ME
female 57 MA
female 35 MA
Laten we het dataframe in oplopende volgorde sorteren met order() op basis van de variabele age.
order(final_data$age)
Bovenstaande code geeft de volgende output:
6 10 3 9 5 8 4 2 7 1
Aangezien leeftijd 25 op index 6 staat, gevolgd door leeftijd 35 op index 10, worden alle leeftijdswaarden op deze manier oplopend gerangschikt.
De code hieronder gebruikt [] met de volgorde op de variabele age om oplopend te rangschikken, waarbij ook de informatie over gender en degree wordt afgedrukt.
final.data[order(final.data$age),]
| gender | age | degree | |
|---|---|---|---|
| 6 | male | 25 | MA |
| 10 | female | 35 | MA |
| 1 | male | 40 | MA |
| 5 | female | 48 | MA |
| 7 | female | 49 | BE |
| 8 | male | 52 | ME |
| 2 | female | 57 | BSCS |
| 9 | female | 57 | MA |
| 4 | female | 61 | BSCS |
| 3 | male | 66 | BE |
Bovenstaande code geeft de volgende output:
gender age degree
6 male 25 MA
10 female 35 MA
1 male 40 MA
5 female 48 MA
7 female 49 BE
8 male 52 ME
2 female 57 BSCS
9 female 57 MA
4 female 61 BSCS
3 male 66 BE
De output hierboven laat zien dat age oplopend is gerangschikt, met de bijbehorende gender- en degree-informatie.
Sorteren met dplyr's arrange()
Voor een leesbaardere en moderne aanpak kun je de functie arrange() uit het dplyr-pakket gebruiken. Dit is vooral handig binnen het tidyverse-ecosysteem:
# Install dplyr if needed: install.packages("dplyr")
library(dplyr)
# Sort by age in ascending order
final_data %>% arrange(age)
# Sort by age in descending order
final_data %>% arrange(desc(age))
# Sort by multiple columns
final_data %>% arrange(gender, desc(age))
De functie arrange() heeft vaak de voorkeur in data-analyseworkflows omdat deze naadloos integreert met andere dplyr-functies zoals filter(), select() en mutate() met behulp van de pipe-operator.
Vergelijking van sorteermethoden
| Function | Returns | Best For | Package |
|---|---|---|---|
sort() |
Gesorteerde waarden | Vectors | Base R |
order() |
Indexen | Data frames, complexe sorteringen | Base R |
arrange() |
Gesorteerd data frame | Tidyverse-workflows | dplyr |
setorder() |
Wijzigt in-place | Grote datasets (geheugenefficiënt) | data.table |
Conclusie
In deze tutorial heb ik de essentiële methoden voor het sorteren van data in R behandeld:
sort()voor het direct sorteren van vectorsorder()voor het krijgen van indexen om vectors en data frames te sorteren- Omgaan met NA-waarden met de parameter
na.last dplyr::arrange()voor moderne, leesbare sortering van data frames- Sorteren op meerdere kolommen voor complexe ordeningsvereisten
Voor meer informatie, zie de officiële R-documentatie voor order().
Wil je meer leren over R? Volg dan DataCamps Introduction to R-cursus. Je kunt ook onze data.table-tutorial verkennen voor high-performance datamanipulatie, of onze gids over pipes in R bekijken voor schonere code.
