Programarea R a devenit un instrument esențial în lumea analizei datelor, oferind capabilități puternice pentru manipularea și analiza seturi de date complexe. Una dintre abilitățile fundamentale pe care programatorii R începători trebuie să le stăpânească este abilitatea de a parcurge liste în mod eficient. Acest articol vă va ghida prin procesul de buclă prin liste în R folosind atât funcțiile de bază R, cât și cele populare purrr pachet, completat cu exemple practice și cele mai bune practici.
Înțelegerea listelor în R
Înainte de a ne aprofunda în tehnicile de buclă, este crucial să înțelegem ce liste sunt în R. Spre deosebire de vectori sau cadre de date, care sunt omogene (conțin elemente de același tip), listele din R sunt structuri de date eterogene. Aceasta înseamnă că pot conține elemente de diferite tipuri, inclusiv alte liste, făcându-le incredibil de versatile pentru stocarea datelor complexe.
# Example of a list in R
my_list <- list(
numbers = c(1, 2, 3),
text = "Hello, R!",
data_frame = data.frame(x = 1:3, y = c("a", "b", "c"))
)
my_list
$numbers (1) 1 2 3 $text (1) "Hello, R!" $data_frame x y 1 1 a 2 2 b 3 3 c
De ce să faci bucla prin liste?
Buclă prin liste este o sarcină comună în programarea R din mai multe motive: 1. Procesarea datelor: Când lucrați cu structuri de date imbricate sau date asemănătoare JSON. 2. Aplicarea funcțiilor: Pentru a efectua aceeași operație pe mai multe elemente. 3. Ingineria caracteristicilor: Crearea de noi variabile pe baza elementelor listei. 4. Agregarea datelor: combinarea rezultatelor din mai multe analize stocate într-o listă.
Construcții în buclă în R
R oferă mai multe moduri de a parcurge liste. Ne vom concentra pe două abordări principale: 1. Bucle de bază R (for şi while) 2. Programare funcțională cu purrr pachet
Folosind Base R pentru trecerea în buclă a listelor
Bucla For în baza R
The for bucla este una dintre cele mai de bază și mai utilizate constructe de buclă din R.
Exemplul 1: Calcularea pătratelor de numere dintr-o listă
numbers_list <- list(1, 2, 3, 4, 5)
squared_numbers <- vector("list", length(numbers_list))
for (i in seq_along(numbers_list)) {
squared_numbers((i)) <- numbers_list((i))^2
}
print(squared_numbers)
((1)) (1) 1 ((2)) (1) 4 ((3)) (1) 9 ((4)) (1) 16 ((5)) (1) 25
While Loop în baza R
Buclele în timp ce sunt utile atunci când trebuie să continuați să repetați până când este îndeplinită o anumită condiție.
Exemplul 2: Găsirea primului număr mai mare de 10 dintr-o listă
numbers_list <- list(2, 4, 6, 8, 10, 12, 14)
index <- 1
while (numbers_list((index)) <= 10) {
index <- index + 1
}
print(paste("The first number greater than 10 is:", numbers_list((index))))
(1) "The first number greater than 10 is: 12"
Introducere în pachetul Purrr
The purrr pachetul, parte a ecosistemului tidyverse, oferă un set de instrumente pentru lucrul cu funcții și vectori în R. Oferă o abordare mai consecventă și mai lizibilă a iterației peste liste.
A folosi purrrmai întâi instalați și încărcați pachetul:
#install.packages("purrr")
library(purrr)
Looping Through Lists cu torc
Folosind funcția map().
The map() funcția este calul de bătaie al purrrpermițându-vă să aplicați o funcție fiecărui element dintr-o listă.
Exemplul 3: Aplicarea unei funcții fiecărui element dintr-o listă
numbers_list <- list(1, 2, 3, 4, 5) squared_numbers <- map(numbers_list, function(x) x^2) # Or using the shorthand notation: # squared_numbers <- map(numbers_list, ~.x^2) print(squared_numbers)
((1)) (1) 1 ((2)) (1) 4 ((3)) (1) 9 ((4)) (1) 16 ((5)) (1) 25
Folosind funcțiile map2() și pmap().
map2() şi pmap() sunt utile atunci când trebuie să repetați mai multe liste simultan.
Exemplu: Combinarea elementelor din două liste
names_list <- list("Alice", "Bob", "Charlie")
ages_list <- list(25, 30, 35)
introduce <- map2(names_list, ages_list, ~paste(.x, "is", .y, "years old"))
print(introduce)
((1)) (1) "Alice is 25 years old" ((2)) (1) "Bob is 30 years old" ((3)) (1) "Charlie is 35 years old"
Comparând Base R și torc
Când decideți între buclele R de bază și purrr funcții, luați în considerare:
- Performanţă: Pentru operații simple, bucle R de bază și
purrrfuncțiile funcționează în mod similar. Pentru operatii complexe,purrrpoate fi mai eficient. - Lizibilitate:
purrrfuncțiile conduc adesea la un cod mai concis și mai ușor de citit, în special pentru operațiuni complexe. - Consecvență:
purrroferă o interfață consistentă pentru lucrul cu liste și alte structuri de date.
Capcane comune și depanare
- Am uitat să folosești paranteze duble
(())pentru indexarea listelor: Foloseștelist((i))în loc delist(i)pentru a accesa elementele listei. - Nu se pre-aloca ieșirea: pentru liste mari, pre-alocați lista de rezultate pentru o performanță mai bună.
- Ignorarea gestionării erorilor: Folosește
safely()saupossibly()dinpurrrpentru a trata erorile cu grație.
Rândul tău!
Acum este timpul să exersați! Încercați să rezolvați această problemă:
Problemă: Aveți o listă de vectori care conțin temperaturi în Celsius. Convertiți fiecare temperatură în Fahrenheit folosind atât o buclă R de bază, cât și a purrr funcţie.
temp_list <- list(c(20, 25, 30), c(15, 18, 22), c(28, 32, 35)) # Your code here # Solution will be provided below
Soluţie:
# Base R solution
fahrenheit_base <- vector("list", length(temp_list))
for (i in seq_along(temp_list)) {
fahrenheit_base((i)) <- (temp_list((i)) * 9/5) + 32
}
# purrr solution
fahrenheit_purrr <- map(temp_list, ~(.x * 9/5) + 32)
# Check results
print(fahrenheit_base)
((1)) (1) 68 77 86 ((2)) (1) 59.0 64.4 71.6 ((3)) (1) 82.4 89.6 95.0
print(fahrenheit_purrr)
((1)) (1) 68 77 86 ((2)) (1) 59.0 64.4 71.6 ((3)) (1) 82.4 89.6 95.0
Fast Takeaways
- Listele din R pot conține elemente de diferite tipuri.
- Oferte Base R
forşiwhilebucle pentru iterare prin liste. - The
purrrpachetul oferă instrumente de programare funcționale, cum ar fimap()pentru operațiuni de listă. - Alegeți între baza R și
purrrbazat pe lizibilitate, performanță și preferințe personale. - Practica este cheia pentru stăpânirea manipulării listelor în R.
Concluzie
Stăpânirea artei de a parcurge liste în R este o abilitate crucială pentru orice analist de date sau programator care lucrează cu acest limbaj versatil. Indiferent dacă alegeți să utilizați buclele R de bază sau abordarea mai funcțională a purrrînțelegerea acestor tehnici vă va îmbunătăți semnificativ capacitatea de a manipula și analiza structuri complexe de date. Amintiți-vă, cel mai bun mod de a vă îmbunătăți este prin practică și experimentare. Continuați să codificați și nu ezitați să explorați resursele vaste disponibile în comunitatea R!
Întrebări frecvente
-
Care este diferența dintre o listă și un vector în R? Listele pot conține elemente de diferite tipuri, în timp ce vectorii sunt omogene și conțin elemente de același tip.
-
Pot folosi bucle cu cadre de date în R? Da, buclele pot fi folosite cu cadre de date, adesea prin iterare pe rânduri sau coloane. Cu toate acestea, pentru multe operațiuni, este mai eficient să folosiți funcții vectorizate sau
applyfuncții familiale. -
Este toarta mai rapid decât buclele R de bază? Pentru operații simple, diferența de performanță este neglijabilă. Cu toate acestea,
purrrpoate fi mai eficient pentru operațiuni complexe și oferă o mai bună lizibilitate. -
Cum instalez pachetul purrr? Utilizare
install.packages("purrr")a instala silibrary(purrr)pentru a-l încărca în sesiunea dvs. R. -
Care sunt câteva alternative la bucle în R? Operatii vectorizate,
applyfuncțiile familiei șidplyrfuncțiile sunt alternative comune la buclele explicite în R.
Ne-ar plăcea să auzim de la tine!
Ți s-a părut util acest ghid? Căutăm mereu să îmbunătățim și să oferim cele mai bune resurse pentru programatorii R. Vă rugăm să vă împărtășiți gândurile, întrebările sau sugestiile în comentariile de mai jos. Și dacă ați găsit acest articol valoros, nu uitați să-l distribuiți rețelei dvs. pe rețelele sociale.
