Î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:
- Folosind negația lui %in%:
!(x %in% y)
- Crearea unui operator personalizat:
`%notin%` <- function(x,y) !(x %in% y)
- 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ă:
- Returnează elemente din vectorul principal care nu sunt în vectorul de excludere
- Gestionați valorile NA în mod corespunzător
- 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ă
- Î: 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.
- Î: 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.
- Î: 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ă.
- Î: 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.
- Î: 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ă! 🚀

Vă puteți conecta cu mine la oricare dintre cele de mai jos:
Canalul Telegram aici: https://t.me/steveondata
