Cum să utilizați operatorul NOT IN în R: un ghid complet cu exemple

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

În programarea R, filtrarea și manipularea datelor sunt abilități necesare oricărui dezvoltator. Una dintre cele mai utile operațiuni pe care le veți întâlni frecvent este verificarea dacă elementele NU sunt prezente într-un anumit set. Deși R nu are un operator „NOT IN” încorporat precum SQL, putem crea și utiliza cu ușurință această funcționalitate. Acest ghid cuprinzător vă va arăta cum să implementați și să utilizați eficient operatorul „NOT IN” în R.

Înainte de a discuta despre operatorul „NU ÎN”, să înțelegem fundamentul operatorilor lui R, în special %in% operator, care formează baza implementării noastre „NOT IN”.

Operatorul %in%.

# Basic %in% operator example
fruits <- c("apple", "banana", "orange")
"apple" %in% fruits  # Returns TRUE
"grape" %in% fruits  # Returns FALSE

The %in% operatorul verifică dacă elementele sunt prezente într-un vector. Returnează un vector logic de aceeași lungime ca și operandul din stânga.

Crearea operatorilor personalizați

R ne permite să creăm operatori de infixare personalizați folosind % simboluri:

# Creating a NOT IN operator
`%notin%` <- function(x,y) !(x %in% y)

# Usage example
5 %notin% c(1,2,3,4)  # Returns TRUE

Sintaxă și Structură

Există mai multe moduri de a implementa funcționalitatea „NOT IN” în R:

  1. Folosind negația lui %in%:
!(x %in% y)
  1. Crearea unui operator personalizat:
`%notin%` <- function(x,y) !(x %in% y)
  1. Folosind setdiff():
length(setdiff(x, y)) > 0

Cele mai bune practici

Când implementați funcționalitatea „NOT IN”, luați în considerare:

  • Sensibilitatea majusculelor
  • Consecvența tipului de date
  • NA manipulare
  • Implicații de performanță

Operații Vectoriale de bază

# Create sample vectors
numbers <- c(1, 2, 3, 4, 5)
exclude <- c(3, 4)

# Find numbers not in exclude
result <- numbers(!(numbers %in% exclude))
print(result)  # Output: 1 2 5

Compararea vectorilor

# More complex example
set1 <- c(1:10)
set2 <- c(2,4,6,8)
not_in_set2 <- set1(!(set1 %in% set2))
print(not_in_set2)  # Output: 1 3 5 7 9 10

Filtrarea cadrelor de date

# Create sample data frame
df <- data.frame(
  id = 1:5,
  name = c("John", "Alice", "Bob", "Carol", "David"),
  score = c(85, 92, 78, 95, 88)
)

# Filter rows where name is not in specified list
exclude_names <- c("Alice", "Bob")
filtered_df <- df(!(df$name %in% exclude_names), )
print(filtered_df)
  id  name score
1  1  John    85
4  4 Carol    95
5  5 David    88

Curățarea datelor

Când curățați seturile de date, funcționalitatea „NOT IN” este deosebit de utilă pentru eliminarea valorilor nedorite:

# Remove outliers
data <- c(1, 2, 2000, 3, 4, 5, 1000, 6)
outliers <- c(1000, 2000)
clean_data <- data(!(data %in% outliers))
print(clean_data)  # Output: 1 2 3 4 5 6

Crearea subsetului

Creați anumite subseturi prin excluderea anumitor categorii:

# Create a categorical dataset
categories <- data.frame(
  product = c("A", "B", "C", "D", "E"),
  category = c("food", "electronics", "food", "clothing", "electronics")
)

# Exclude electronics
non_electronic <- categories(!(categories$category %in% "electronics"), )
print(non_electronic)
  product category
1       A     food
3       C     food
4       D clothing

Operații în stilul bazei de date

Implementați operațiuni NOT IN asemănătoare SQL în R:

# Create two datasets
main_data <- data.frame(
  customer_id = 1:5,
  name = c("John", "Alice", "Bob", "Carol", "David")
)

excluded_ids <- c(2, 4)

# Filter customers not in excluded list
active_customers <- main_data(!(main_data$customer_id %in% excluded_ids), )
print(active_customers)
  customer_id  name
1           1  John
3           3   Bob
5           5 David

Considerații de performanță

# More efficient for large datasets
# Using which()
large_dataset <- 1:1000000
exclude <- c(5, 10, 15, 20)
result1 <- large_dataset(which(!large_dataset %in% exclude))

# Less efficient
result2 <- large_dataset(!large_dataset %in% exclude)
print(identical(result1, result2))  # Output: TRUE

Gestionarea erorilor

Validați-vă întotdeauna intrările:

safe_not_in <- function(x, y) {
  if (!is.vector(x) || !is.vector(y)) {
    stop("Both arguments must be vectors")
  }
  !(x %in% y)
}

Lizibilitatea codului

Creați cod clar, auto-documentat:

# Good practice
excluded_categories <- c("electronics", "furniture")
filtered_products <- products(!(products$category %in% excluded_categories), )

# Instead of
filtered_products <- products(!(products$category %in% c("electronics", "furniture")), )

Acum este timpul să exersezi! Încercați să rezolvați această problemă:

Problemă:

Creați o funcție care ia doi vectori: un vector principal de numere și un vector de excludere. Funcția ar trebui să:

  1. Returnează elemente din vectorul principal care nu sunt în vectorul de excludere
  2. Gestionați valorile NA în mod corespunzător
  3. Tipăriți numărul elementelor excluse

Încercați să codificați singur acest lucru înainte de a căuta soluția de mai jos.

Soluţie:

advanced_not_in <- function(main_vector, exclude_vector) {
  # Remove NA values
  main_clean <- main_vector(!is.na(main_vector))
  exclude_clean <- exclude_vector(!is.na(exclude_vector))
  
  # Find elements not in exclude vector
  result <- main_clean(!(main_clean %in% exclude_clean))
  
  # Count excluded elements
  excluded_count <- length(main_clean) - length(result)
  
  # Print summary
  cat("Excluded", excluded_count, "elementsn")
  
  return(result)
}

# Test the function
main <- c(1:10, NA)
exclude <- c(2, 4, 6, NA)
result <- advanced_not_in(main, exclude)
print(result)
  • Operația „NOT IN” poate fi implementată folosind !(x %in% y)
  • Operatorii personalizați pot fi creați folosind % sintaxă
  • Luați în considerare implicațiile de performanță pentru seturi mari de date
  • Gestionați întotdeauna valorile NA în mod corespunzător
  • Utilizați operații vectoriale pentru o performanță mai bună
  1. Î: Pot folosi „NOT IN” cu diferite tipuri de date?

Da, dar asigurați-vă că ambii vectori sunt de tipuri compatibile. R va încerca constrângerea de tip, ceea ce ar putea duce la rezultate neașteptate.

  1. Î: Cum gestionează „NOT IN” valorile NA?

În mod implicit, valorile NA necesită o manipulare specială. Utilizare is.na() pentru a trata în mod explicit valorile NA.

  1. Î: Există o diferență de performanță între !(x %in% y) și crearea unui operator personalizat?

Nu există diferențe semnificative de performanță; ambele abordări folosesc același mecanism de bază.

  1. Î: Pot folosi „NOT IN” cu coloanele de cadre de date?

Da, funcționează bine cu coloanele cadru de date, în special pentru filtrarea rândurilor pe baza valorilor coloanei.

  1. Î: Cum mă ocup de diferența dintre majuscule și minuscule în comparațiile de caractere?

Utilizare tolower() sau toupper() pentru a standardiza cazul înainte de comparare.

Înțelegerea și utilizarea eficientă a operațiunii „NOT IN” în R este crucială pentru manipularea și analiza datelor. Indiferent dacă filtrați seturi de date, curățați datele sau efectuați analize complexe, stăpânirea acestui concept va face programarea dvs. R mai eficientă și eficientă.

Vă încurajez să experimentați cu exemplele oferite și să le adaptați nevoilor dumneavoastră specifice. Împărtășiți-vă experiențele și întrebările în comentariile de mai jos și nu uitați să marcați acest ghid pentru referințe viitoare!


Codare fericită! 🚀

NU INTRA cu R

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

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


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.