Manipularea datelor este o abilitate crucială în programarea R, iar subsetarea cadrelor de date este una dintre cele mai comune operațiuni pe care le veți efectua. Acest ghid cuprinzător vă va ghida prin patru metode puternice de a subseta cadre de date în R, complet cu exemple practice și cele mai bune practici.
Înainte de a aborda anumite metode, este esențial să înțelegeți ce înseamnă subsetarea. Subsetarea este procesul de extragere a anumitor porțiuni din cadrul de date pe baza anumitor condiții. Aceasta ar putea implica selectarea:
- Rânduri specifice
- Coloane specifice
- O combinație a ambelor
- Date care îndeplinesc anumite condiții
Sintaxa paranteze pătrate
Cea mai fundamentală modalitate de a subgrupa un cadru de date în R este utilizarea parantezelor drepte. Sintaxa de bază este:
df(rows, columns)
Exemple cu selecția rândurilor și coloanelor
# Create a sample data frame
df <- data.frame(
id = 1:5,
name = c("Alice", "Bob", "Charlie", "David", "Eve"),
age = c(25, 30, 35, 28, 32),
salary = c(50000, 60000, 75000, 55000, 65000)
)
# Select first three rows
first_three <- df(1:3, )
print(first_three)
id name age salary 1 1 Alice 25 50000 2 2 Bob 30 60000 3 3 Charlie 35 75000
# Select specific columns
names_ages <- df(, c("name", "age"))
print(names_ages)
name age 1 Alice 25 2 Bob 30 3 Charlie 35 4 David 28 5 Eve 32
# Select rows based on condition high_salary <- df(df$salary > 60000, ) print(high_salary)
id name age salary 3 3 Charlie 35 75000 5 5 Eve 32 65000
Filtrare avansată cu operatori logici
# Multiple conditions result <- df(df$age > 30 & df$salary > 60000, ) print(result)
id name age salary 3 3 Charlie 35 75000 5 5 Eve 32 65000
# OR conditions result <- df(df$name == "Alice" | df$name == "Bob", ) print(result)
id name age salary 1 1 Alice 25 50000 2 2 Bob 30 60000
Sintaxa de bază subset().
Funcția subset() oferă o alternativă mai lizibilă la paranteze drepte:
subset(data, subset = condition, select = columns)
Condiții complexe cu subset()
# Filter by age and select specific columns
result <- subset(df,
age > 30,
select = c(name, salary))
print(result)
name salary 3 Charlie 75000 5 Eve 65000
# Multiple conditions
result <- subset(df,
age > 25 & salary < 70000,
select = -id) # exclude id column
print(result)
name age salary 2 Bob 30 60000 4 David 28 55000 5 Eve 32 65000
Folosind funcția filter().
library(dplyr) # Basic filtering high_earners <- df %>% filter(salary > 60000) print(high_earners)
id name age salary 1 3 Charlie 35 75000 2 5 Eve 32 65000
# Multiple conditions experienced_high_earners <- df %>% filter(age > 30, salary > 60000) print(experienced_high_earners)
id name age salary 1 3 Charlie 35 75000 2 5 Eve 32 65000
Folosind funcția select().
# Select specific columns names_ages <- df %>% select(name, age) print(names_ages)
name age 1 Alice 25 2 Bob 30 3 Charlie 35 4 David 28 5 Eve 32
# Select columns by pattern
salary_related <- df %>%
select(contains("salary"))
print(salary_related)
salary 1 50000 2 60000 3 75000 4 55000 5 65000
Operații de combinare
final_dataset <- df %>% filter(age > 30) %>% select(name, salary) %>% arrange(desc(salary)) print(final_dataset)
name salary 1 Charlie 75000 2 Eve 65000
date.table Sintaxă
library(data.table) dt <- as.data.table(df) # Basic subsetting result <- dt(age > 30) print(result)
id name age salary1: 3 Charlie 35 75000 2: 5 Eve 32 65000
# Complex filtering result <- dt(age > 30 & salary > 60000, .(name, salary)) print(result)
name salary
1: Charlie 75000
2: Eve 65000
- Verificați întotdeauna structura rezultatului dvs. cu
str() - Fiți atenți la numele coloanelor care conțin spații
- Utilizați tipuri de date adecvate pentru condițiile de filtrare
- Luați în considerare performanța pentru seturi de date mari
- Menține lizibilitatea codului
Problemă: Creați un cadru de date cu informații despre angajați și efectuați următoarele operații:
- Filtrați angajații cu vârsta peste 25 de ani
- Selectați numai coloanele cu nume și salariu
- Sortați după salariu în ordine descrescătoare
Încercați să rezolvați singur acest lucru înainte de a căuta soluția de mai jos!
Faceți clic pentru a dezvălui soluția
Soluţie:
# Create sample data
employees <- data.frame(
name = c("John", "Sarah", "Mike", "Lisa"),
age = c(24, 28, 32, 26),
salary = c(45000, 55000, 65000, 50000)
)
# Using dplyr
library(dplyr)
result <- employees %>%
filter(age > 25) %>%
select(name, salary) %>%
arrange(desc(salary))
# Using base R
result_base <- employees(employees$age > 25, c("name", "salary"))
result_base <- result_base(order(-result_base$salary), )
- Subsetarea bazei R este fundamentală, dar poate fi verbosă
- Funcția subset() oferă o mai bună lizibilitate
- dplyr oferă operații intuitive și care pot fi înlănțuite
- data.table este optim pentru seturi mari de date
- Alegeți metoda care se potrivește cel mai bine nevoilor și stilului dvs. de codare
- Î: Care metodă de subsetare este cea mai rapidă?
data.table este, în general, cel mai rapid, în special pentru seturile de date mari, urmat de baza R și dplyr.
- Î: Pot amesteca diferite metode de subsetare?
Da, dar este recomandat să rămâneți la un singur stil pentru consecvență și lizibilitate.
- Î: De ce subsetul meu returnează rezultate neașteptate?
Cauzele frecvente includ tipuri de date incorecte, valori lipsă (NA) sau probleme de prioritate a operatorilor logici.
- Î: Cum fac subset bazat pe mai multe coloane?
Utilizați operatori logici (&, |) pentru a combina condițiile între coloane.
- Î: Care este diferența dintre select() și filter()?
filter() funcționează pe rânduri în funcție de condiții, în timp ce select() alege coloanele.
