Liste în programarea R: Cum se creează și se selectează elemente

⚡ Rezumat inteligent

O listă R este un obiect care stochează vectori, matrici, cadre de date și chiar alte liste într-un singur container. Funcția list() o construiește, iar parantezele pătrate duble extrag orice element înapoi.

  • 🧺 Depozitare mixtă: O listă conține obiecte de diferite tipuri și lungimi, lucru pe care un vector simplu nu îl poate face.
  • 🛠️ Pasul de construire: list(vect, mat, df) împachetează un vector, o matrice și un cadru de date într-un singur obiect.
  • 🔢 Acces la poziție: my_list[[2]] returnează elementul în sine, în timp ce my_list[2] returnează o listă cu un singur element.
  • 🏷️ Elemente denumite: Etichetarea elementelor la creare permite accesul prin intermediul operatorului $ sau [[„nume”]].
  • ✏️ Modificări la fața locului: Reatribuirea actualizează un element, iar atribuirea valorii NULL îl elimină din listă.
  • 🔗 Aplatizare: Funcția unlist() restrânge o listă imbricată într-un singur vector atomic pentru analiza ulterioară.

Crearea unei liste în programarea R și selectarea elementelor

Ce este R List?

Lista R este un obiect din programarea R care include matrici, vectori, cadre de date sau liste în cadrul acestuia. R List este folosit și pentru a stoca o colecție de obiecte și a le folosi atunci când avem nevoie de ele. Ne putem imagina lista R ca o geantă pentru a pune multe articole diferite. Când trebuie să folosim un articol, putem deschide geanta și o putem folosi.

Contrastul cu un vector este ceea ce face ca geanta să fie utilă. Un vector forțează fiecare element să fie de același tip, așa că plasarea unui cuvânt lângă un număr transformă numărul în text. O listă nu aplică o astfel de regulă, motiv pentru care poate conține un vector cu cinci elemente, un vector cu două rânduri matrice și un cadru de date cu 714 rânduri alăturate, fără a le modifica.

Sintaxa Listă în R

Putem folosi funcția list() pentru a crea liste în programarea R:

list(element_1, ...)
arguments:
-element_1: store any type of R object
-...: pass as many objects as specifying. each object needs to be separated by a comma

Fiecare argument poate fi transmis simplu sau sub forma tag = valoareUn argument simplu devine un element pozițional accesibil doar prin numărul său, în timp ce un argument etichetat primește și un nume. Referința de bază R pentru listă() documentează atât formularele, cât și notează că unlist() acționează ca o inversă aproximativă a lui as.list().

Cum se creează o listă în R

Mai jos este un proces pas cu pas despre cum să creați o listă în R:

În exemplul de mai jos, vom crea trei obiecte diferite, un Vector, o Matrice și a Cadrul de date folosind funcția listă în R.

Pasul 1) Creați un vector

Utilizați codul de mai jos pentru a crea un vector în R

# Vector with numeric from 1 up to 5
vect  <- 1:5

Operatorul două puncte construiește secvența 1, 2, 3, 4, 5 ca un vector întreg, iar săgeata de atribuire o stochează sub numele vect.

Pasul 2) Creați o matrice

Acum, creați o matrice folosind următorul cod

# A 2x 5 matrix
mat  <- matrix(1:9, ncol = 5)
dim(mat)

Două detalii merită atenție aici. O grilă de două rânduri pe cinci coloane are nevoie de zece valori, însă sunt furnizate doar nouă, așa că R reciclează secvența și afișează un avertisment că lungimea datelor nu este un submultiplu al numărului de rânduri. Această valoare reciclată este motivul pentru care al doilea rând al matricei afișate se termină în 1 în loc de 10. Apelul către dim() raportează apoi forma.

ieșire:

## [1] 2 5

Pasul 3) Creați un cadru de date

Creați un cadru de date în R folosind codul de mai jos

# select the 10th row of the built-in R data set EuStockMarkets
df <- EuStockMarkets[1:10,]

Comentariul menționează al zecelea rând, dar expresia păstrează rândurile de la 1 la 10 din seria EuStockMarkets încorporată. Subsetarea elimină și clasa seriilor temporale, deci ceea ce se obține este o matrice numerică mai degrabă decât un cadru de date real, motiv pentru care rezultatul afișat mai jos conține etichete de rând în stil [1,] în loc de nume de rânduri. Încadrați apelul în as.data.frame() ori de câte ori este nevoie de un cadru de date real.

Pasul 4) Creați o listă în R

Acum, putem pune cele trei obiecte în lista R folosind codul de mai jos

# Construct list with these vec, mat, and df:
my_list <- list(vect, mat, df)
my_list

ieșire:

## [[1]]
## [1] 1 2 3 4 5

## [[2]]
##       [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

## [[3]]
##          DAX    SMI    CAC   FTSE
##  [1,] 1628.75 1678.1 1772.8 2443.6
##  [2,] 1613.63 1688.5 1750.5 2460.2
##  [3,] 1606.51 1678.6 1718.0 2448.2
##  [4,] 1621.04 1684.1 1708.1 2470.4
##  [5,] 1618.16 1686.6 1723.1 2484.7
##  [6,] 1610.61 1671.6 1714.3 2466.8
##  [7,] 1630.75 1682.9 1734.5 2487.9
##  [8,] 1640.17 1703.6 1757.4 2508.4
##  [9,] 1635.47 1697.5 1754.0 2510.5
##  [10,] 1645.89 1716.3 1754.3 2497.4

Cele trei antete între paranteze duble din acea ieșire reprezintă pozițiile listei. Nimic nu a fost aplatizat sau forțat: elementul unu este încă un vector întreg, elementul doi este încă o matrice, iar elementul trei conține încă toate cele zece rânduri de prețuri ale acțiunilor.

Selectați Elemente din lista R

După ce am construit lista noastră, o putem accesa destul de ușor. Trebuie să folosim [[index]] pentru a selecta un element dintr-o listă. Valoarea din interiorul parantezei pătrate duble reprezintă poziția elementului într-o listă pe care dorim să o exprimăm.tract. De exemplu, dacă trecem 2 în paranteză, R returnează al doilea element listat.

Acum în asta R tutorial, să încercăm să selectăm al doilea element al listelor în R numit my_list, folosim my_list[[2]]

# Print second element of the list
my_list[[2]]

ieșire:

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

Parantezele simple și duble nu sunt interschimbabile, iar confuzia lor este cea mai frecventă sursă de erori în listă. O paranteză păstrează învelișul, două paranteze îl elimină.

Expresie Ce se întoarce Clasa rezultatului Folosește-l când
lista_mea[[2]] Elementul stocat în sine Orice a fost stocat, aici o matrice Trebuie să calculezi pe un singur element
lista_mea[2] O sublistă care conține acel element listă Trebuie să păstrați învelișul listei
lista_mea[c(1, 3)] O sublistă a elementelor alese listă Ai nevoie de mai multe elemente simultan
lista_mea[-2] Fiecare element, cu excepția celui de-al doilea listă Trebuie să renunți la un element
# Compare the two bracket styles
class(my_list[[2]])   # the matrix itself
class(my_list[2])     # a list of length one

# Several elements, and everything but one element
my_list[c(1, 3)]
my_list[-2]

Liste de nume în R

Indexurile poziționale sunt fragile: se introduce un element și fiecare număr după ce se deplasează. Denumirea elementelor elimină acest risc și face ca codul să fie citit ca datele pe care le descrie. Numele pot fi furnizate la construirea listei sau atașate ulterior cu names().

# Tag each element at creation time
named_list <- list(numbers = vect, grid = mat, prices = df)

# Three ways to reach the same element
named_list$grid
named_list[["grid"]]
named_list["grid"]      # returns a one-element list

# Read or replace the names later
names(named_list)
names(named_list)[2] <- "grid_2x5"

Operatorul $ și paranteza dublă diferă într-un aspect care îi ia prin surprindere pe începători. Operatorul $ efectuează potriviri parțiale, așadar named_list$pri găsește în continuare prețurile, în timp ce named_list[[„pri”]] returnează NULL deoarece parantezele duble se potrivesc exact, cu excepția cazului în care se transmite exact = FALSE. Potrivirea parțială este convenabilă în consolă și nesigură într-un script, așa că este de preferat forma exactă în codul salvat.

# A compact map of the whole structure
str(named_list)

Funcția str() afișează o linie per element cu tipul și dimensiunea acestuia, aceasta fiind cea mai rapidă metodă de a confirma că o listă conține ceea ce vă așteptați înainte de a o indexa.

Modificarea, adăugarea și ștergerea elementelor într-o listă R

O listă nu este fixă ​​odată creată. Aceiași accesori care citesc un element scriu și în el, așadar actualizarea, extinderea și micșorarea unei liste utilizează toate atribuiri obișnuite.

# Replace an element in place
named_list[["numbers"]] <- 1:10

# Add a new element simply by naming it
named_list[["created"]] <- Sys.Date()

# Append without a name: the element lands at the end
named_list <- append(named_list, list(TRUE))

# Delete an element by assigning NULL to it
named_list[["created"]] <- NULL
  • A inlocui: Atribuirea unui nume existent suprascrie elementul respectiv și îi lasă poziția neschimbată.
  • Adauga: Atribuirea unui nume care nu există adaugă un element nou la sfârșitul listei.
  • Adăuga: append() primește o listă ca al doilea argument, așadar încapsulează o valoare goală în list() înainte de a o transmite.
  • Șterge: Atribuirea valorii NULL între paranteze duble elimină elementul și scurtează lista.

O consecință îi împiedică pe oameni în mod regulat: deoarece NULL înseamnă ștergere, nu poți stoca un NULL real cu paranteze duble. Folosește în schimb atribuirea cu paranteze simple, ca în named_list[„empty”] <- list(NULL), care păstrează slotul și plasează NULL în interiorul acestuia.

Liste imbricate și unlist() în R

Deoarece o listă poate conține orice obiect R, ea poate conține o altă listă. Imbricarea este modul în care obiectele de configurare, răspunsurile JSON și rezultatele modelului sunt de obicei reprezentate în R, așadar accesarea unei liste imbricate și aplatizarea acesteia sunt ambele sarcini zilnice.

# A list whose elements are themselves lists
project <- list(
  meta = list(owner = "analyst", year = 2026),
  data = list(vect, mat)
)

# Chain the accessors to reach an inner value
project$meta$year
project[["data"]][[2]]

# Flatten every level into one atomic vector
flat <- unlist(project)

# Strip a single level and keep the rest as a list
half <- unlist(project, recursive = FALSE)

Aplatizarea are un cost care merită înțeles. unlist() trebuie să returneze un vector atomic, deci forțează fiecare valoare la cel mai general tip prezent, urmând ordinea logical, integer, double, character. O listă imbricată care combină numere cu text se întoarce, prin urmare, în întregime ca text. Numele rezultatului sunt construite prin unirea etichetelor exterioare și interioare, motiv pentru care un element ajunge ca meta.owner mai degrabă decât ca owner.

Transmiteți use.names = FALSE atunci când acele nume compuse nu sunt dorite și setați recursive = FALSE atunci când trebuie eliminat doar stratul cel mai exterior. Dacă valorile trebuie să își păstreze tipurile, lăsați structura intactă și parcurgeți lista în loc să o aplatizați.

Cadru de date încorporat în R

Listele sunt adesea umplute cu date citite de pe disc sau de pe web, așa că este util să vedem cum sosește un cadru de date înainte de a fi stocat în interiorul acestuia. Înainte de a crea propriul nostru cadru de date, putem arunca o privire asupra setului de date R disponibil online. Setul de date al închisorii are o dimensiune de 714×5. Putem arunca o privire rapidă asupra părții de jos a cadrului de date cu funcția tail(). Prin analogie, head() afișează partea de sus a cadrului de date. Puteți specifica numărul de rânduri afișate cu head (df, 5). Vom afla mai multe despre funcția read.csv() în importul de date în R tutorial.

PATH <-'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/prison.csv'
df <- read.csv(PATH)[1:5]
head(df, 5)

ieșire:

##   X state year govelec black
## 1 1     1   80       0 0.2560
## 2 2     1   81       0 0.2557
## 3 3     1   82       1 0.2554
## 4 4     1   83       0 0.2551
## 5 5     1   84       0 0.2548

[1:5] care urmează după read.csv() selectează primele cinci coloane, nu primele cinci rânduri, deoarece un cadru de date este el însuși o listă de coloane. Indexarea cu paranteze simple pe o listă returnează o listă mai mică, iar aici acea listă mai mică este tot un cadru de date.

Putem verifica structura cadrului de date cu str:

# Structure of the data
str(df)

ieșire:

## 'data.frame':    714 obs. of  5 variables:
##  $ X      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ state  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ year   : int  80 81 82 83 84 85 86 87 88 89 ...
##  $ govelec: int  0 0 1 0 0 0 1 0 0 0 ...
##  $ black  : num  0.256 0.256 0.255 0.255 0.255 ...

Toate variabilele sunt stocate în numeric format. Prefixul $ de pe fiecare linie este același operator folosit anterior în listele denumite, ceea ce confirmă faptul că un cadru de date este o listă de coloane de lungime egală purtând o etichetă dreptunghiulară. Prin urmare, tot ce a fost învățat despre denumirea, selectarea și ștergerea elementelor listei se transferă direct în Tipuri de date R și la coloanele cadrului de date.

Întrebări frecvente

Un vector obligă fiecare element să aibă același tip, așadar amestecarea textului și a numerelor obligă totul să fie format din caractere. O listă păstrează fiecare element exact așa cum este furnizat, inclusiv vectori, matrici și funcții de lungimi diferite. Folosește typeof() pentru a le distinge.

Apelați is.list(x), care returnează TRUE pentru liste și liste perechi. class(x) raportează clasa obiectului, în timp ce typeof(x) returnează „list” chiar și pentru cadrele de date, deoarece un cadru de date este o listă de coloane de lungime egală dedesubt.

length(my_list) numără doar elementele de nivel superior, deci o listă imbricată este considerată ca una singură. lengths(my_list) raportează dimensiunea fiecărui element dintr-un singur apel, ceea ce este mai rapid și mai clar decât loo.ping când elementele diferă.

lapply(lista_mea, FUN) aplică un funcţie pentru fiecare element și returnează o listă. sapply() simplifică rezultatul într-un vector sau o matrice, acolo unde este posibil. O buclă for simplă peste seq_along(my_list) funcționează și se citește clar.

Când fiecare element are aceeași lungime, as.data.frame(my_list) funcționează direct. Pentru o listă de rânduri cu lățime egală, do.call(rbind, my_list) le stivuiește mai întâi. dplyr ecosystem oferă as_tibble() atunci când tipurile de coloane trebuie să supraviețuiască neatinse.

Listele nu au sortare încorporată, deci ex.tracprima cheie comparabilă: my_list[order(sapply(my_list, length))] reordonează după dimensiunea elementului. Pentru date dreptunghiulare, convertiți într-un cadru și sortează cadrul de date cu order() în schimb.

Asistenții inteligenți artificiali citesc ieșirea funcției str() și explică de ce un index a returnat NULL sau o sublistă în loc de o valoare. De asemenea, sugerează forma corectă a parantezelor, schițează canalele lapply() și semnalează coerciția silențioasă a tipului înainte ca aceasta să corupă un rezultat.

Da. Copilotul GitHub lucrează în RStudio 2023.09.0 și versiunile ulterioare prin Instrumente, Opțiuni globale, apoi setările asistentului de cod. Acesta completează apelurile list(), names() și unlist() dintr-un comentariu, deși fiecare sugestie trebuie încă revizuită.

Rezumați această postare cu: