Διαδρομές
/
R
R
/
Ύλη
/
Φιλτράρισμα διανυσμάτων
Φι

Φιλτράρισμα διανυσμάτων σε R

3 ασκήσεις

Σχετικά με την έννοια Φιλτράρισμα διανυσμάτων

Είδαμε στην έννοια Vectors ότι ένα διάνυσμα μπορεί να χρησιμοποιηθεί σε μια υπό συνθήκη έκφραση, δίνοντας ένα λογικό διάνυσμα. Αυτό, με τη σειρά του, μπορεί να χρησιμοποιηθεί σε συναρτήσεις όπως οι all() και any().

v <- c(4, 7, 10)
v >= 6
#> [1] FALSE  TRUE  TRUE
all(v > 6)
#> [1] FALSE    # not all elements match this condition
any(v > 6)
#> [1] TRUE     # at least one element matches

Η τεχνική είναι πολύ πιο ισχυρή από αυτό.

Υποσύνολα διανύσματος

Μπορείς να βγάλεις επιλεγμένα στοιχεία ενός διανύσματος με έναν αριθμό θέσης ή με ένα διάνυσμα θέσεων:

v <- 5:10
v
#> [1]  5  6  7  8  9 10
v[3] 
#> [1] 7
v[c(2, 4)]
#> [1] 6 8

Εναλλακτικά, χρησιμοποίησε ένα λογικό διάνυσμα για να φιλτράρεις το αρχικό διάνυσμα, παίρνοντας ένα υποσύνολο στοιχείων που αντιστοιχούν σε τιμή TRUE:

v <- 1:3
bools <- c(FALSE, TRUE, TRUE)
v[bools]
#> [1] 2 3

Από εκεί, ένα μικρό βήμα σε χωρίζει από το να δημιουργήσεις το διάνυσμα Boolean με μια υπό συνθήκη έκφραση:

bools <- v >= 2
bools
#> [1] FALSE  TRUE  TRUE

v[bools]
#> [1] 2 3

# simpler form
v[v >= 2]
#> [1] 2 3

Αυτές οι υπό συνθήκη εκφράσεις μπορούν να είναι οσοδήποτε σύνθετες, με πολλά διανύσματα ή συναρτήσεις:

v <- 1:10
w <- 10:1

# pairwise comparison
v > w
#> [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

# shorter form
v[v > w]
#> [1]  6  7  8  9 10

Ονοματολογία

Ονομάσαμε αυτή την έννοια "Φιλτράρισμα Διανυσμάτων", ελπίζοντας ότι έτσι θα βγάζει νόημα για όσο το δυνατόν περισσότερους προγραμματιστές.

Στην κοινότητα της R, ο όρος "Subsetting" είναι πιθανώς πιο συνηθισμένος.

Ανακύκλωση

Για λόγους απλότητας, όλα τα παραπάνω παραδείγματα συνέκριναν διανύσματα ίδιου μήκους. Τι γίνεται, όμως, αν τα μήκη δεν ταιριάζουν;

Η απάντηση είναι κάτι ισχυρό, αν το χρησιμοποιήσεις σκόπιμα, αλλά μπερδεύει αν δεν το περιμένεις.

Ένα παράδειγμα:

v <- 1:6
cond <- c(TRUE, FALSE)
v[cond]
#> [1] 1 3 5

Τι συνέβη εκεί; Χρησιμοποιήσαμε ένα Boolean μήκους 2 ως θέσεις σε ένα διάνυσμα μήκους 6, αλλά πήραμε ως αποτέλεσμα ένα διάνυσμα μήκους 3.

Αν ένα διάνυσμα είναι κατά κάποιον τρόπο "πολύ κοντό" για την έκφραση στην οποία χρησιμοποιείται, η R θα το επαναλάβει μέχρι να φτάσει στο επιθυμητό μήκος: αυτό λέγεται "ανακύκλωση". Έτσι, το διάνυσμα c(TRUE, FALSE) έγινε c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE) και το v[cond] επέστρεψε μετά τις τιμές TRUE του v: στην περίπτωσή μας, τους μονούς αριθμούς.

Πώς εξηγείται, λοιπόν, το επόμενο παράδειγμα;

v <- 1:3
0.5 * v
#> [1] 0.5 1.0 1.5
2 + v
#> [1] 3 4 5

Με μια πρώτη ματιά μοιάζει με πολλαπλασιασμό βαθμωτού μεγέθους και (λίγο παράξενη) πρόσθεση βαθμωτού μεγέθους, αλλά στην R δεν υπάρχουν βαθμωτά μεγέθη.

Αντ' αυτού, η R ανακυκλώνει τους αριθμούς, ώστε να δημιουργήσει ένα διάνυσμα με μήκος ίσο με του v, και μετά εφαρμόζει την αριθμητική πράξη στοιχείο προς στοιχείο, χρησιμοποιώντας c(0.5, 0.5, 0.5) ή c(2, 2, 2).

Caution

Η ανακύκλωση είναι πάρα πολύ χρήσιμη, αλλά βεβαιώσου ότι αυτό θέλεις.

Μια μικρή διαφορά στα μήκη των διανυσμάτων (π.χ. 99 έναντι 100) μπορεί να προκαλέσει μπερδεμένα bugs.

Κάποιοι συγγραφείς συνιστούν να χρησιμοποιείς την ανακύκλωση μόνο όταν ένα από τα διανύσματα έχει μήκος 1.

Εύρεση θέσεων

Η συνάρτηση which() δέχεται ένα όρισμα Boolean και επιστρέφει ένα διάνυσμα με τις θέσεις που δίνουν TRUE.

v
#> [1] 2 7 9

v[v > 5]  # returns values
#> [1]  7  9

which(v > 5) # returns indices
#> [1] 2 3

Έλεγχος αν υπάρχει ένα στοιχείο

Οι προηγούμενες ενότητες αφορούσαν την εύρεση στοιχείων που ταιριάζουν με κάποιο κριτήριο.

Αν θέλεις απλώς να μάθεις αν το διάνυσμα περιέχει ένα συγκεκριμένο στοιχείο, χρησιμοποιείς τον τελεστή %in%.

3 %in% 1:5
#> [1] TRUE
7 %in% 1:5
#> [1] FALSE

Αυτό είναι λειτουργικά ισοδύναμο με τον παρακάτω κώδικα, αλλά πολύ πιο βολικό:

length(v[v == 3]) > 0
#> [1] TRUE

Υπάρχει επίσης ο τελεστής %notin%, που δίνει το λογικό not του %in%.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Φιλτράρισμα διανυσμάτων

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 2 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Φιλτράρισμα διανυσμάτων