Cum să utilizați drop_na pentru a arunca rânduri cu valori lipsă în R: un ghid complet

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Valorile lipsă sunt o provocare comună în analiza datelor și pot avea un impact semnificativ asupra rezultatelor, dacă nu sunt tratate corespunzător. În R, aceste valori lipsă sunt reprezentate ca NA (Nu este disponibil) și necesită o atenție specială în timpul preprocesării datelor.

De ce contează valorile lipsă

Datele lipsă pot: – Denaturarea analizelor statistice – Încărcarea ipotezelor modelului – A duce la concluzii incorecte – A provoca erori în funcțiile care nu gestionează bine valorile NA

# Example of how missing values affect calculations
numbers <- c(1, 2, NA, 4, 5)
mean(numbers)  # Returns NA
mean(numbers, na.rm = TRUE)  # Returns 3

The drop_na() funcția face parte din pachetul tidyr, care este inclus în colecția tidyverse. Această funcție oferă o modalitate simplă de a elimina rândurile care conțin valori lipsă din setul de date.

Configurare de bază

# Load required packages
library(tidyverse)
library(tidyr)

# Create sample dataset
df <- data.frame(
  id = 1:5,
  name = c("John", "Jane", NA, "Bob", "Alice"),
  age = c(25, NA, 30, 35, 28),
  score = c(85, 90, NA, 88, NA)
)

Utilizare de bază

# Remove all rows with any missing values
clean_df <- df %>% drop_na()
print(clean_df)
  id name age score
1  1 John  25    85
2  4  Bob  35    88

Direcționarea anumitor coloane

Puteți specifica ce coloane să verificați pentru valori lipsă:

# Only drop rows with missing values in name and age columns
df %>% drop_na(name, age)
  id  name age score
1  1  John  25    85
2  4   Bob  35    88
3  5 Alice  28    NA
# Use column selection helpers
df %>% drop_na(starts_with("s"))
  id name age score
1  1 John  25    85
2  2 Jane  NA    90
3  4  Bob  35    88

Optimizarea performanței

  1. Luați în considerare dimensiunea setului dvs. de date:
# For large datasets, consider using data.table
library(data.table)
Attaching package: 'data.table'
The following objects are masked from 'package:lubridate':

    hour, isoweek, mday, minute, month, quarter, second, wday, week,
    yday, year
The following objects are masked from 'package:dplyr':

    between, first, last
The following object is masked from 'package:purrr':

    transpose
dt <- as.data.table(df)
dt(complete.cases(dt))
      id   name   age score
      
1:     1   John    25    85
2:     4    Bob    35    88
  1. Profilați codul dvs.:
library(profvis)
profvis({
  result <- df %>% drop_na()
})

Capcane comune

  1. Pierderea prea multor date:
# Check proportion of missing data first
missing_summary <- df %>%
  summarise_all(~sum(is.na(.)/n()))
print(missing_summary)
  id name age score
1  0  0.2 0.2   0.4
  1. Fără a lua în considerare impactul:
# Compare statistics before and after dropping
summary(df)
       id        name                age            score      
 Min.   :1   Length:5           Min.   :25.00   Min.   :85.00  
 1st Qu.:2   Class :character   1st Qu.:27.25   1st Qu.:86.50  
 Median :3   Mode  :character   Median :29.00   Median :88.00  
 Mean   :3                      Mean   :29.50   Mean   :87.67  
 3rd Qu.:4                      3rd Qu.:31.25   3rd Qu.:89.00  
 Max.   :5                      Max.   :35.00   Max.   :90.00  
                                NA's   :1       NA's   :2      
summary(df %>% drop_na())
       id           name                age           score      
 Min.   :1.00   Length:2           Min.   :25.0   Min.   :85.00  
 1st Qu.:1.75   Class :character   1st Qu.:27.5   1st Qu.:85.75  
 Median :2.50   Mode  :character   Median :30.0   Median :86.50  
 Mean   :2.50                      Mean   :30.0   Mean   :86.50  
 3rd Qu.:3.25                      3rd Qu.:32.5   3rd Qu.:87.25  
 Max.   :4.00                      Max.   :35.0   Max.   :88.00  

Exemplul 1: Curățarea datelor sondajului

survey_data <- data.frame(
  respondent_id = 1:5,
  age = c(25, 30, NA, 40, 35),
  income = c(50000, NA, 60000, 75000, 80000),
  satisfaction = c(4, 5, NA, 4, 5)
)

# Clean essential fields only
clean_survey <- survey_data %>%
  drop_na(age, satisfaction)

Exemplul 2: Analiza serii temporale

time_series_data <- data.frame(
  date = seq(as.Date("2023-01-01"), by = "day", length.out = 5),
  value = c(100, NA, 102, 103, NA),
  quality = c("good", "poor", NA, "good", "good")
)

# Clean time series data
clean_ts <- time_series_data %>%
  drop_na(value)  # Only drop if value is missing

Eroare: obiect nu a fost găsit

# Wrong
df %>% drop_na()  # Error if tidyr not loaded
  id name age score
1  1 John  25    85
2  4  Bob  35    88
# Correct
library(tidyr)
df %>% drop_na()
  id name age score
1  1 John  25    85
2  4  Bob  35    88

Tratarea cazurilor speciale

# Dealing with infinite values
df_with_inf <- df %>%
  mutate(ratio = c(1, Inf, NA, 2, 3))

# Remove both NA and Inf
df_clean <- df_with_inf %>%
  drop_na() %>%
  filter(is.finite(ratio))

print(df_with_inf)
  id  name age score ratio
1  1  John  25    85     1
2  2  Jane  NA    90   Inf
3  3    30    NA    NA
4  4   Bob  35    88     2
5  5 Alice  28    NA     3
print(df_clean)
  id name age score ratio
1  1 John  25    85     1
2  4  Bob  35    88     2

Încercați acest exercițiu de practică:

Problemă: Curățați următorul set de date eliminând rândurile cu valori lipsă din coloanele esențiale (nume și scor), permițând în același timp valorile lipsă în coloanele opționale.

practice_df <- data.frame(
  name = c("Alex", NA, "Charlie", "David", NA),
  score = c(90, 85, NA, 88, 92),
  comments = c("Good", NA, "Excellent", NA, "Great")
)

Click pentru a vedea soluția

Soluţie:

clean_practice <- practice_df %>%
  drop_na(name, score)

print(clean_practice)
   name score comments
1  Alex    90     Good
2 David    88     
  • Utilizare drop_na() din pachetul tidyr pentru manipularea eficientă a valorilor lipsă
  • Specificați coloane pentru a viza anumite valori lipsă
  • Luați în considerare utilizarea pragurilor pentru o gestionare mai flexibilă a valorii lipsă
  • Verificați întotdeauna proporția datelor înainte de a elimina rândurile
  • Combinați cu alte funcții ordonate pentru curățarea puternică a datelor
  1. Î: Drop_na() modifică setul de date original? R: Nu, creează un nou set de date, urmând principiile de programare funcțională ale lui R.

  2. Î: Poate drop_na() să gestioneze diferite tipuri de valori lipsă? R: Se ocupă de valorile NA ale lui R, dar este posibil să aveți nevoie de pași suplimentari pentru alte reprezentări de valori lipsă.

  3. Î: Cum funcționează drop_na() cu seturi de date mari? R: În general, este eficient, dar luați în considerare utilizarea data.table pentru seturi de date foarte mari.

  4. Î: Pot folosi drop_na() cu date grupate? R: Da, respectă structura grupului atunci când este utilizat cu obiecte grouped_df.

  5. Î: Prin ce diferă drop_na() de na.omit()? R: drop_na() oferă mai multă flexibilitate și se integrează mai bine cu funcțiile tidyverse.

Ai găsit acest ghid util? Împărtășește-l cu colegii tăi programatori R! Aveți întrebări sau sugestii? Lasă un comentariu mai jos sau conectează-te cu mine pe rețelele profesionale. Feedbackul dvs. ajută la îmbunătățirea acestor resurse pentru toată lumea din comunitatea R.


Codare fericită! 🚀

Aruncarea na în R

Vă puteți conecta cu mine la oricare dintre cele de mai jos:

Canalul Telegram aici: https://t.me/steveondata

Bluesky Network aici: https://bsky.app/profile/spsanderson.com


Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.