Πώς να αντικαταστήσετε τις τιμές που λείπουν (NA) στο R: na.omit & na.rm
Οι τιμές που λείπουν στην επιστήμη δεδομένων προκύπτουν όταν λείπει μια παρατήρηση σε μια στήλη ενός πλαισίου δεδομένων ή περιέχει μια τιμή χαρακτήρα αντί για αριθμητική τιμή. Οι τιμές που λείπουν πρέπει να διαγραφούν ή να αντικατασταθούν προκειμένου να εξαχθούν σωστά συμπεράσματα από τα δεδομένα.
Σε αυτό το σεμινάριο, θα μάθουμε πώς να αντιμετωπίζουμε τις τιμές που λείπουν με τη βιβλιοθήκη dplyr. Η βιβλιοθήκη dplyr είναι μέρος ενός οικοσυστήματος για την πραγματοποίηση μιας ανάλυσης δεδομένων.
Σε αυτό το σεμινάριο, θα μάθετε
- αλλάσσω()
- Εξαίρεση τιμών που λείπουν (NA)
- Υπολογίστε τις ελλείπουσες τιμές (NA) με τον μέσο όρο και τον διάμεσο
αλλάσσω()
Το τέταρτο ρήμα στο βιβλιοθήκη dplyr είναι χρήσιμο για τη δημιουργία νέας μεταβλητής ή την αλλαγή των τιμών μιας υπάρχουσας μεταβλητής.
Θα προχωρήσουμε σε δύο μέρη. Θα μάθουμε πώς να:
- εξαιρέσει τις τιμές που λείπουν από ένα πλαίσιο δεδομένων
- υπολογίστε τιμές που λείπουν με τη μέση και τη διάμεσο
Το ρήμα mutate() είναι πολύ εύκολο στη χρήση. Μπορούμε να δημιουργήσουμε μια νέα μεταβλητή ακολουθώντας αυτή τη σύνταξη:
mutate(df, name_variable_1 = condition, ...) arguments: -df: Data frame used to create a new variable -name_variable_1: Name and the formula to create the new variable -...: No limit constraint. Possibility to create more than one variable inside mutate()
Εξαίρεση τιμών που λείπουν (NA)
Η μέθοδος na.omit() από τη βιβλιοθήκη dplyr είναι ένας απλός τρόπος για να αποκλειστεί η παρατήρηση που λείπει. Η απόρριψη όλων των NA από τα δεδομένα είναι εύκολη, αλλά δεν σημαίνει ότι είναι η πιο κομψή λύση. Κατά τη διάρκεια της ανάλυσης, είναι συνετό να χρησιμοποιείτε ποικιλία μεθόδων για την αντιμετώπιση τιμών που λείπουν
Για να αντιμετωπίσουμε το πρόβλημα των παρατηρήσεων που λείπουν, θα χρησιμοποιήσουμε το τιτανικό σύνολο δεδομένων. Σε αυτό το σύνολο δεδομένων, έχουμε πρόσβαση στις πληροφορίες των επιβατών κατά τη διάρκεια της τραγωδίας. Αυτό το σύνολο δεδομένων έχει πολλά NA που πρέπει να ληφθούν υπόψη.
Θα ανεβάσουμε το αρχείο csv από το διαδίκτυο και μετά θα ελέγξουμε ποιες στήλες έχουν NA. Για να επιστρέψουμε τις στήλες με δεδομένα που λείπουν, μπορούμε να χρησιμοποιήσουμε τον ακόλουθο κώδικα:
Ας ανεβάσουμε τα δεδομένα και ας επαληθεύσουμε τα δεδομένα που λείπουν.
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv" df_titanic <- read.csv(PATH, sep = ",") # Return the column names containing missing observations list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ] list_na
Παραγωγή:
## [1] "age" "fare"
Εδώ,
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Δίνει το όνομα των στηλών που δεν έχουν δεδομένα.
Οι στήλες ηλικία και ναύλος έχουν τιμές που λείπουν.
Μπορούμε να τα ρίξουμε με το na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
Παραγωγή:
## [1] 1045 13
Το νέο σύνολο δεδομένων περιέχει 1045 σειρές σε σύγκριση με 1309 με το αρχικό σύνολο δεδομένων.
Καταλογίστε δεδομένα που λείπουν με τον μέσο όρο και τον διάμεσο
Θα μπορούσαμε επίσης να υπολογίσουμε (συμπληρώσουμε) τις τιμές που λείπουν με τη διάμεσο ή τη μέση τιμή. Μια καλή πρακτική είναι να δημιουργήσετε δύο ξεχωριστές μεταβλητές για τη μέση και τη διάμεσο. Μόλις δημιουργηθούν, μπορούμε να αντικαταστήσουμε τις τιμές που λείπουν με τις μεταβλητές που σχηματίστηκαν πρόσφατα.
Θα χρησιμοποιήσουμε τη μέθοδο εφαρμογής για να υπολογίσουμε τη μέση τιμή της στήλης με NA. Ας δούμε ένα παράδειγμα
Βήμα 1) Νωρίτερα στο σεμινάριο, αποθηκεύσαμε το όνομα στηλών με τις τιμές που λείπουν στη λίστα που ονομάζεται list_na. Θα χρησιμοποιήσουμε αυτή τη λίστα
Βήμα 2) Τώρα πρέπει να υπολογίσουμε τη μέση τιμή με το όρισμα na.rm = TRUE. Αυτό το όρισμα είναι υποχρεωτικό επειδή λείπουν δεδομένα από τις στήλες και αυτό λέει στον R να τα αγνοήσει.
# Create mean average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, mean, na.rm = TRUE) average_missing
Επεξήγηση κώδικα:
Περνάμε 4 ορίσματα στη μέθοδο εφαρμογής.
- df: df_titanic[,colnames(df_titanic) %in% list_na]. Αυτός ο κωδικός θα επιστρέψει το όνομα στηλών από το αντικείμενο list_na (π.χ. "ηλικία" και "ναύλος")
- 2: Υπολογίστε τη συνάρτηση στις στήλες
- μέσος όρος: Υπολογίστε τον μέσο όρο
- na.rm = TRUE: Αγνοήστε τις τιμές που λείπουν
Παραγωγή:
## age fare ## 29.88113 33.29548
Δημιουργήσαμε με επιτυχία τον μέσο όρο των στηλών που περιέχουν παρατηρήσεις που λείπουν. Αυτές οι δύο τιμές θα χρησιμοποιηθούν για την αντικατάσταση των παρατηρήσεων που λείπουν.
Βήμα 3) Αντικαταστήστε τις τιμές NA
Το ρήμα mutate από τη βιβλιοθήκη dplyr είναι χρήσιμο για τη δημιουργία μιας νέας μεταβλητής. Δεν θέλουμε απαραίτητα να αλλάξουμε την αρχική στήλη, ώστε να μπορούμε να δημιουργήσουμε μια νέα μεταβλητή χωρίς το NA. Το mutate είναι εύκολο στη χρήση, απλώς επιλέγουμε ένα όνομα μεταβλητής και ορίζουμε τον τρόπο δημιουργίας αυτής της μεταβλητής. Εδώ είναι ο πλήρης κώδικας
# Create a new variable with the mean and median df_titanic_replace <- df_titanic %>% mutate(replace_mean_age = ifelse(is.na(age), average_missing[1], age), replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))
Επεξήγηση κώδικα:
Δημιουργούμε δύο μεταβλητές, replace_mean_age και replace_mean_fare ως εξής:
- replace_mean_age = ifelse(is.na(ηλικία), average_missing[1], ηλικία)
- replace_mean_fare = ifelse(is.na(ναύλος), average_missing[2],ναύλος)
Εάν η ηλικία της στήλης έχει τιμές που λείπουν, αντικαταστήστε το με το πρώτο στοιχείο του μέσου όρου_λείπει (μέσος όρος ηλικίας), διαφορετικά διατηρήστε τις αρχικές τιμές. Ίδια λογική για ναύλο
sum(is.na(df_titanic_replace$age))
Παραγωγή:
## [1] 263
Εκτελέστε την αντικατάσταση
sum(is.na(df_titanic_replace$replace_mean_age))
Παραγωγή:
## [1] 0
Η αρχική ηλικία στήλης έχει 263 τιμές που λείπουν, ενώ η μεταβλητή που δημιουργήθηκε πρόσφατα τις αντικατέστησε με το μέσο όρο της μεταβλητής ηλικίας.
Βήμα 4) Μπορούμε να αντικαταστήσουμε τις παρατηρήσεις που λείπουν με τη διάμεσο επίσης.
median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, median, na.rm = TRUE) df_titanic_replace <- df_titanic %>% mutate(replace_median_age = ifelse(is.na(age), median_missing[1], age), replace_median_fare = ifelse(is.na(fare), median_missing[2], fare)) head(df_titanic_replace)
Παραγωγή:
Βήμα 5) Ένα μεγάλο σύνολο δεδομένων θα μπορούσε να έχει πολλές τιμές που λείπουν και η παραπάνω μέθοδος θα μπορούσε να είναι δυσκίνητη. Μπορούμε να εκτελέσουμε όλα τα παραπάνω βήματα σε μία γραμμή κώδικα χρησιμοποιώντας τη μέθοδο sapply(). Αν και δεν θα γνωρίζαμε τις τιμές του μέσου όρου και του μέσου όρου.
sapply δεν δημιουργεί α πλαίσιο δεδομένων, έτσι μπορούμε να τυλίξουμε τη συνάρτηση sapply() μέσα στο data.frame() για να δημιουργήσουμε ένα αντικείμενο πλαισίου δεδομένων.
# Quick code to replace missing values with the mean df_titanic_impute_mean < -data.frame( sapply( df_titanic, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))
Σύνοψη
Έχουμε τρεις μεθόδους για να αντιμετωπίσουμε τις τιμές που λείπουν:
- Εξαιρέστε όλες τις παρατηρήσεις που λείπουν
- Καταλογισμός με το μέσο όρο
- Καταλογισμός με τη διάμεσο
Ο παρακάτω πίνακας συνοψίζει τον τρόπο κατάργησης όλων των παρατηρήσεων που λείπουν
Βιβλιοθήκη | Σκοπός | Κώδικας |
---|---|---|
βάση | Κατάλογος παρατηρήσεων που λείπουν |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Αφαιρέστε όλες τις τιμές που λείπουν |
na.omit(df) |
Ο καταλογισμός με μέσο όρο ή διάμεσο μπορεί να γίνει με δύο τρόπους
- Χρησιμοποιώντας την εφαρμογή
- Χρήση sapply
Μέθοδος | Περιγραφή | Πλεονεκτήματα | Μειονεκτήματα |
---|---|---|---|
Βήμα προς βήμα με την εφαρμογή | Ελέγξτε τις στήλες που λείπουν, υπολογίστε τη μέση/διάμεσο, αποθηκεύστε την τιμή, αντικαταστήστε με mutate() | Γνωρίζετε την αξία των μέσων/μέσου | Περισσότερος χρόνος εκτέλεσης. Μπορεί να είναι αργό με μεγάλο σύνολο δεδομένων |
Γρήγορος τρόπος με αρμολόγηση | Χρησιμοποιήστε τα sapply() και data.frame() για αυτόματη αναζήτηση και αντικατάσταση τιμών που λείπουν με μέσο/διάμεσο | Σύντομος κωδικός και γρήγορος | Δεν γνωρίζω τις τιμές καταλογισμού |