Lister i R-programmering: Hvordan opprette og velge elementer

โšก Smart oppsummering

R List er et objekt som lagrer vektorer, matriser, datarammer og til og med andre lister i รฉn enkelt beholder. List()-funksjonen bygger den, og doble hakeparenteser trekker ethvert element ut igjen.

  • ๐Ÿงบ Blandet lagring: En liste inneholder objekter av forskjellige typer og lengder, noe en vanlig vektor ikke kan gjรธre.
  • ๐Ÿ› ๏ธ Byggetrinn: list(vekt, mat, df) pakker en vektor, en matrise og en dataramme inn i ett objekt.
  • ๐Ÿ”ข Posisjonstilgang: my_list[[2]] returnerer selve elementet, mens my_list[2] returnerer en liste med ett element.
  • ๐Ÿท๏ธ Navngitte elementer: Tagging av elementer ved opprettelse gir tilgang via $-operatoren eller [[ยซnavnยป]].
  • โœ๏ธ Redigeringer pรฅ stedet: Ny tildeling oppdaterer et element, og tildeling av NULL fjerner det fra listen.
  • ๐Ÿ”— Utflating: unlist() kollapser en nestet liste til รฉn atomvektor for nedstrรธms analyse.

R-liste Opprett en liste i R-programmering og velg elementer

Hva er R List?

R Liste er et objekt i R-programmering som inkluderer matriser, vektorer, datarammer eller lister i det. R List brukes ogsรฅ til รฅ lagre en samling objekter og bruke dem nรฅr vi trenger dem. Vi kan forestille oss R-listen som en pose for รฅ sette mange forskjellige varer. Nรฅr vi skal bruke en vare, kan vi รฅpne posen og bruke den.

Kontrasten med en vektor er det som gjรธr posen nyttig. En vektor tvinger hvert element til รฉn type, sรฅ รฅ plassere et ord ved siden av et tall gjรธr tallet til tekst. En liste bruker ingen slik regel, og det er derfor den kan ha en vektor med fem elementer, en vektor med to rader matrise og en dataramme med 714 rader side om side uten รฅ endre noen av dem.

Syntaks for liste i R

Vi kan bruke list()-funksjonen til รฅ lage lister i R-programmering:

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

Hvert argument kan sendes enten uten eller pรฅ formen tag = verdiEt rent argument blir et posisjonselement som bare kan nรฅs med nummeret sitt, mens et tagget argument ogsรฅ fรฅr et navn. Den grunnleggende R-referansen for liste() dokumenterer bรฅde skjemaer og notater som viser at unlist() fungerer som en omtrentlig invers av as.list().

Hvordan lage en liste i R

Nedenfor er en trinnvis prosess for hvordan du oppretter en liste i R:

I eksemplet nedenfor vil vi lage tre forskjellige objekter, en vektor, en matrise og en Dataramme ved รฅ bruke listefunksjonen i R.

Trinn 1) Lag en vektor

Bruk koden nedenfor for รฅ lage en vektor i R

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

Kolonoperatoren bygger sekvensen 1, 2, 3, 4, 5 som en heltallsvektor, og tildelingspilen lagrer den under navnet vect.

Trinn 2) Lag en matrise

Lag nรฅ en matrise ved รฅ bruke fรธlgende kode

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

To detaljer fortjener oppmerksomhet her. Et rutenett med to rader ganger fem kolonner trenger ti verdier, men bare ni er oppgitt, sรฅ R resirkulerer sekvensen og skriver ut en advarsel om at datalengden ikke er et delmultiplum av antall rader. Denne resirkulerte verdien er grunnen til at den andre raden i den utskrevne matrisen slutter pรฅ 1 i stedet for 10. Kallet til dim() rapporterer deretter formen.

Utgang:

## [1] 2 5

Trinn 3) Lag dataramme

Lag en dataramme i R ved รฅ bruke koden nedenfor

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

Kommentaren nevner den tiende raden, men uttrykket beholder rad 1 til 10 i den innebygde EuStockMarkets-serien. Delsetting fjerner ogsรฅ tidsserieklassen, sรฅ det som kommer tilbake er en numerisk matrise i stedet for en ekte dataramme, og det er nettopp derfor det utskrevne resultatet nedenfor har radetiketter i [1,]-stil i stedet for radnavn. Pakk inn kallet i as.data.frame() nรฅr en ekte dataramme er nรธdvendig.

Trinn 4) Lag en liste i R

Nรฅ kan vi sette de tre objektene i R-listen ved รฅ bruke koden nedenfor

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

Utgang:

## [[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

De tre dobbeltparentesoverskriftene i den utdataene er listeposisjonene. Ingenting ble flatet ut eller tvunget: element รฉn er fortsatt en heltallsvektor, element to er fortsatt en matrise, og element tre inneholder fortsatt alle ti radene med aksjekurser.

Velg elementer fra R-listen

Etter at vi har bygget listen vรฅr, kan vi enkelt fรฅ tilgang til den. Vi mรฅ bruke [[indeks]] for รฅ velge et element i en liste. Verdien i den doble firkantede parentesen representerer posisjonen til elementet i en liste vi รธnsker รฅ vise.tract. Hvis vi for eksempel setter 2 i parentesen, returnerer R det andre elementet som er oppfรธrt.

Nรฅ i dette R opplรฆring, la oss prรธve รฅ velge de andre elementene i listene i R kalt min_liste, vi bruker min_liste[[2]]

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

Utgang:

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

Enkle og doble parenteser er ikke utskiftbare, og det รฅ blande dem sammen er den vanligste kilden til listefeil. ร‰n parentes beholder omslaget, to parenteser fjerner det.

Uttrykk Hva kommer tilbake Resultatets klasse Bruk den nรฅr
min_liste[[2]] Selve det lagrede elementet Uansett hva som ble lagret, her en matrise Du mรฅ beregne pรฅ ett element
min_liste[2] En delliste som inneholder det ene elementet liste Du mรฅ beholde listeomslaget
min_liste[c(1, 3)] En delliste over de valgte elementene liste Du trenger flere elementer samtidig
min_liste[-2] Hvert element unntatt det andre liste Du mรฅ fjerne et 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]

Navngitte lister i R

Posisjonsindekser er sรฅrbare: sett inn ett element, og hvert tall etter det forskyves. ร… navngi elementene fjerner denne risikoen og gjรธr at koden leses som dataene den beskriver. Navn kan oppgis nรฅr listen bygges, eller legges ved etterpรฅ med 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"

$-operatoren og den doble parentesen er forskjellige pรฅ รฉn mรฅte som fanger nybegynnere opp. $-operatoren utfรธrer delvis samsvar, sรฅ named_list$pri finner fortsatt priser, mens named_list[[โ€œpriโ€]] returnerer NULL fordi doble parenteser samsvarer nรธyaktig med mindre exact = FALSE sendes. Delvis samsvar er praktisk i konsollen og usikkert i et skript, sรฅ foretrekk den eksakte formen i lagret kode.

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

str() skriver ut รฉn linje per element med type og stรธrrelse, som er den raskeste mรฅten รฅ bekrefte at en liste inneholder det du forventer fรธr du indekserer i den.

Endre, legge til og slette elementer i en R-liste

En liste er ikke fast nรฅr den er opprettet. De samme tilgangsprogrammene som leser et element skriver ogsรฅ til det, sรฅ oppdatering, utvidelse og krymping av en liste bruker alle vanlig tildeling.

# 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
  • Erstatte: ร… tilordne et eksisterende navn overskriver elementet og lar posisjonen vรฆre uendret.
  • Legg til: ร… tilordne et navn som ikke finnes, legger til et nytt element pรฅ slutten av listen.
  • Legg til: append() tar en liste som sitt andre argument, sรฅ pakk inn en ren verdi i list() fรธr den sendes.
  • Slett: ร… tilordne NULL med doble parenteser fjerner elementet og forkorter listen.

En konsekvens av dette er at folk ofte snubler: fordi NULL betyr sletting, kan du ikke lagre en faktisk NULL med doble parenteser. Bruk tildeling med รฉn parentes i stedet, som i named_list[โ€œemptyโ€] <- list(NULL), som beholder sporet og plasserer NULL inni det.

Nestede lister og unlist() i R

Fordi en liste kan inneholde et hvilket som helst R-objekt, kan den inneholde en annen liste. Nesting er hvordan konfigurasjonsobjekter, JSON-svar og modellresultater vanligvis representeres i R, sรฅ det รฅ nรฅ inn i en nestet liste og flate ut en er begge hverdagsoppgaver.

# 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)

Flatning har en kostnad som er verdt รฅ forstรฅ. unlist() mรฅ returnere รฉn atomvektor, sรฅ den tvinger hver verdi til den mest generelle typen som er tilstede, i rekkefรธlgen logisk, heltall, dobbel, tegn. En nestet liste som blander tall med tekst kommer derfor tilbake utelukkende som tekst. Navnene pรฅ resultatet bygges ved รฅ koble sammen de ytre og indre taggene, og det er derfor et element kommer som meta.owner i stedet for owner.

Gi use.names = FALSE nรฅr disse sammensatte navnene er uรธnskede, og sett recursive = FALSE nรฅr bare det ytterste laget skal fjernes. Hvis verdiene mรฅ beholde typene sine, la strukturen vรฆre intakt og arbeid deg gjennom listen i stedet for รฅ flate den ut.

Innebygd dataramme i R

Lister er ofte fylt med data lest fra disk eller fra nettet, sรฅ det hjelper รฅ se hvordan en dataramme ankommer fรธr den lagres i en. Fรธr vi lager vรฅr egen dataramme, kan vi ta en titt pรฅ R-datasettet som er tilgjengelig pรฅ nettet. Prison-datasettet har en dimensjon pรฅ 714 ร— 5. Vi kan fรฅ en rask titt pรฅ bunnen av datarammen med tail()-funksjonen. Analogt viser head() toppen av datarammen. Du kan angi antall rader som vises med head(df, 5). Vi vil lรฆre mer om funksjonen read.csv() i importer data i R opplรฆringen.

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

Utgang:

##   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]-en som fรธlger etter read.csv() velger de fรธrste fem kolonnene, ikke de fรธrste fem radene, fordi en dataramme i seg selv er en liste med kolonner. Indeksering med รฉn parentes pรฅ en liste returnerer en mindre liste, og her er den mindre listen fortsatt en dataramme.

Vi kan sjekke strukturen til datarammen med str:

# Structure of the data
str(df)

Utgang:

## '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 ...

Alle variabler er lagret i numerisk format. Prefikset $ pรฅ hver linje er den samme operatoren som ble brukt pรฅ navngitte lister tidligere, noe som bekrefter at en dataramme er en liste med kolonner av samme lengde som har en rektangulรฆr etikett. Alt som lรฆres om รฅ navngi, velge og slette listeelementer overfรธres derfor direkte til R-datatyper og til datarammekolonner.

Spรธrsmรฅl og svar

En vektor tvinger hvert element til รฅ dele รฉn type, sรฅ blanding av tekst og tall tvinger alt til รฅ bli tegn. En liste beholder hvert element nรธyaktig slik det er levert, inkludert vektorer, matriser og funksjoner med ulik lengde. Bruk typeof() for รฅ skille de to fra hverandre.

Kall is.list(x), som returnerer TRUE for lister og parlister. class(x) rapporterer objektklassen, mens typeof(x) returnerer ยซlisteยป selv for datarammer, fordi en dataramme er en liste med kolonner av samme lengde under.

length(my_list) teller bare elementene pรฅ toppnivรฅ, sรฅ en nestet liste teller fortsatt som รฉn. lengths(my_list) rapporterer stรธrrelsen pรฅ hvert element i et enkelt kall, noe som er raskere og tydeligere enn loo.ping nรฅr elementene er forskjellige.

lapply(my_list, FUN) bruker en funksjon til hvert element og returnerer en liste. sapply() forenkler resultatet til en vektor eller matrise der det er mulig. En vanlig for-lรธkke over seq_along(my_list) fungerer ogsรฅ og leses tydelig.

Nรฅr hvert element har samme lengde, fungerer as.data.frame(my_list) direkte. For en liste med rader med lik bredde, stabler do.call(rbind, my_list) dem fรธrst. dplyr รธkosystemet tilbyr as_tibble() nรฅr kolonnetyper mรฅ overleve uberรธrt.

Lister har ingen innebygd sortering, sรฅ f.eks.tracta en sammenlignbar nรธkkel fรธrst: my_list[order(apply(my_list, length))] omorganiserer etter elementstรธrrelse. For rektangulรฆre data, konverter til en ramme og sorter datarammen med order() i stedet.

AI-assistenter leser str()-utdata og forklarer hvorfor en indeks returnerte NULL eller en underliste i stedet for en verdi. De foreslรฅr ogsรฅ riktig brakettform, utarbeider lapply()-pipelines og flagger stille type-tvang fรธr det รธdelegger et resultat.

Ja. GitHub Copilot jobber i RStudio 2023.09.0 og senere via Verktรธy, Globale alternativer, og deretter kodeassistentinnstillingen. Den fullfรธrer list(), names() og unlist()-kall fra en kommentar, men alle forslag mรฅ fortsatt gjennomgรฅs.

Oppsummer dette innlegget med: