Listák R programozásban: Elemek létrehozása és kiválasztása

⚡ Okos összefoglaló

Az R List egy olyan objektum, amely vektorokat, mátrixokat, adatkereteket és akár más listákat is tárol egyetlen konténerben. A list() függvény felépíti, és a dupla szögletes zárójelek kihúzzák belőle a kívánt elemeket.

  • 🧺 Vegyes tárolás: Egy lista különböző típusú és hosszúságú objektumokat tartalmaz, amit egy egyszerű vektor nem tud megtenni.
  • 🇧🇷 Építési lépés: A list(vect, mat, df) egy vektort, egy mátrixot és egy adatkeretet csomagol egyetlen objektumba.
  • 🔢 Pozícióhozzáférés: A my_list[[2]] visszaadja magát az elemet, míg a my_list[2] egy egyelemű listát ad vissza.
  • 🏷️ Elnevezett elemek: Az elemek létrehozáskor történő címkézése a $ operátoron vagy a [[„név”]] paraméteren keresztül teszi lehetővé a hozzáférést.
  • ✏️ Helyi szerkesztések: Az újrahozzárendelés frissíti az elemet, a NULL érték hozzárendelése pedig eltávolítja azt a listából.
  • 🔗 Lapítás: Az unlist() függvény egy beágyazott listát egyetlen atomi vektorrá csuk össze a későbbi elemzéshez.

R lista Lista létrehozása R programozásban és elemek kiválasztása

Mi az az R-lista?

R lista egy olyan objektum az R programozásban, amely mátrixokat, vektorokat, adatkereteket vagy listákat tartalmaz. Az R List objektumok gyűjteményének tárolására is használható, és akkor használjuk őket, amikor szükségünk van rájuk. Elképzelhetjük az R listát egy táskaként, ahol sokféle tárgyat helyezhetünk el. Amikor használnunk kell egy tárgyat, kinyithatjuk a táskát és használhatjuk.

A vektorral való különbség teszi a zsákot hasznossá. Egy vektor minden elemet egyetlen típusba kényszerít, így egy szó elhelyezése egy szám mellé szöveggé alakítja a számot. Egy lista nem vonatkozik ilyen szabályra, ezért hordozhat öt elemű vektort, egy kétsorost mátrix és egy 714 soros adatkeretet egymás mellett anélkül, hogy bármelyiket is megváltoztatnánk.

A lista szintaxisa az R-ben

R programozásban a list() függvénnyel hozhatunk létre listákat:

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

Minden argumentum átadható üresen vagy a következő formában: címke = értékEgy csupasz argumentum egy pozicionális elemmé válik, amely csak a száma alapján érhető el, míg egy címkézett argumentum nevet is kap. Az alap R hivatkozás a következőhöz: lista () A dokumentációk formákat és megjegyzik, hogy az unlist() az as.list() közelítő inverzeként működik.

Hogyan készítsünk listát R-ben

Az alábbiakban egy lépésről lépésre bemutatjuk, hogyan hozhat létre listát az R-ben:

Az alábbi példában három különböző objektumot fogunk létrehozni, egy vektort, egy mátrixot és egy Dataframe a lista funkció használatával az R-ben.

1. lépés) Hozzon létre egy vektort

Használja az alábbi kódot vektor létrehozásához R-ben

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

A kettőspont operátor az 1, 2, 3, 4, 5 sorozatot egész vektorként építi fel, és az értékadó nyíl vect néven tárolja.

2. lépés) Hozzon létre egy mátrixot

Most hozz létre egy mátrixot a következő kóddal

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

Két részlet érdemel itt figyelmet. Egy két soros és öt oszlopos rácsnak tíz értékre van szüksége, mégis csak kilencet adunk meg, ezért az R újrahasznosítja a sorozatot, és egy figyelmeztetést nyomtat, hogy az adathossz nem a sorok számának többszöröse. Ez az újrahasznosított érték az oka annak, hogy a kinyomtatott mátrix második sora 1-gyel végződik 10 helyett. A dim() függvény hívása ezután visszaadja az alakzatot.

output:

## [1] 2 5

3. lépés: Adatkeret létrehozása

Hozzon létre egy adatkeretet R-ben az alábbi kód segítségével

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

A megjegyzés a tizedik sort említi, de a kifejezés megtartja a beépített EuStockMarkets sorozat 1-től 10-ig terjedő sorait. A részhalmaz az idősor osztályt is elhagyja, így egy numerikus mátrixot ad vissza, nem pedig valódi adatkeretet, pontosan ezért tartalmaz az alábbi kinyomtatott eredmény [1,] stílusú sorcímkéket a sornevek helyett. Csomagolja be a hívást az as.data.frame() függvénybe, amikor valódi adatkeretre van szükség.

4. lépés) Hozzon létre egy listát az R-ben

Most a három objektumot az R listába helyezhetjük az alábbi kód segítségével

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

output:

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

A kimenetben található három dupla zárójeles fejléc a lista pozícióit jelöli. Semmi sem lett lapítva vagy kényszerítve: az első elem továbbra is egy egész vektor, a második elem továbbra is egy mátrix, a harmadik elem pedig továbbra is tartalmazza mind a tíz sor részvényárat.

Válassza az Elemeket az R listából

Miután elkészítettük a listánkat, könnyen hozzáférhetünk hozzá. Az [[index]] karaktert kell használnunk egy elem kiválasztásához a listában. A dupla szögletes zárójelben lévő érték a kiszámolni kívánt elem pozícióját jelöli a listában.tract. Például, ha a zárójelen belül 2-t adunk át, az R a másodikként felsorolt ​​elemet adja vissza.

Most ebben R oktatóanyag, próbáljuk meg kiválasztani a listák második elemét az R-ben my_list néven, mi a my_list[[2]]

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

output:

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

Az egyes és a kettős zárójelek nem felcserélhetők, és összekeverésük a listahibák leggyakoribb forrása. Egy zárójel megtartja a csomagolást, két zárójel eltávolítja.

Kifejezés Ami visszajön Az eredmény osztályozása Használd, amikor
sajat_listám[[2]] Maga a tárolt elem Bármit is tároltak, itt egy mátrix Egy elemre kell számolnod
sajat_listám[2] Egy allista, amely azt az egy elemet tartalmazza lista Meg kell őrizned a listaburkolót
sajat_list[c(1, 3)] A kiválasztott elemek allitsa lista Több elemre van szüksége egyszerre
sajat_listám[-2] Minden elem, kivéve a másodikat lista El kell dobnod egy elemet
# 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]

Név szerinti listák R-ben

A pozícióindexek sérülékenyek: egy elemet kell beszúrni, és minden utána következő szám eltolódik. Az elemek elnevezése kiküszöböli ezt a kockázatot, és a kódot úgy olvassa a rendszer, mint az általuk leírt adatokat. A nevek megadhatók a lista építésekor, vagy utólag is csatolhatók a names() függvénnyel.

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

A $ operátor és a dupla zárójel egy tekintetben különbözik, ami megfogja a kezdőket. A $ operátor részleges egyezést végez, így a named_list$pri továbbra is megtalálja az árakat, míg a named_list[[„pri”]] NULL értéket ad vissza, mivel a dupla zárójel pontosan egyezik, kivéve, ha az exact = FALSE értéket adjuk át. A részleges egyezés a konzolon kényelmes, de szkriptben nem biztonságos, ezért a mentett kódban a pontos formát részesítsük előnyben.

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

Az str() függvény elemenként egy sort nyomtat ki a típusával és méretével, ami a leggyorsabb módja annak, hogy indexelés előtt ellenőrizzük, hogy egy lista tartalmazza-e a várt tartalmat.

Elemek módosítása, hozzáadása és törlése egy R listában

Egy lista létrehozás után nem végleges. Ugyanazok az akcesszorok írnak is rá, amelyek olvassák az elemet, így a lista frissítése, kiterjesztése és zsugorítása mind hagyományos értékadást használ.

# 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
  • Csere: Egy meglévő névhez rendelve felülírja az adott elemet, és a pozícióját változatlanul hagyja.
  • Kedvencek: Egy nem létező névhez rendelve egy új elemet fűzünk a lista végéhez.
  • Mellékel: Az append() egy listát fogad el második argumentumként, ezért a list()-ben átadása előtt egy üres értéket kell megadni.
  • Töröl: A NULL érték dupla zárójelben történő megadása eltávolítja az elemet és lerövidíti a listát.

Az egyik következmény rendszeresen botlást okoz az embereknek: mivel a NULL törlést jelent, nem tárolhatsz tényleges NULL értéket dupla zárójelben. Ehelyett használj egyetlen zárójeles értékadást, például a named_list[„üres”] <- list(NULL) formában, amely megtartja a helyet, és NULL értéket helyez el benne.

Beágyazott listák és unlist() az R-ben

Mivel egy lista bármilyen R objektumot tartalmazhat, egy másik listát is tartalmazhat. A beágyazás az, ahogyan a konfigurációs objektumokat, a JSON válaszokat és a modell eredményeit általában ábrázolják az R-ben, így egy beágyazott listához való hozzáférés és egy lapítás mindennapi feladat.

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

A lapításnak megvan az ára, amit érdemes megérteni. Az unlist() függvénynek egyetlen atomi vektort kell visszaadnia, így minden értéket a legáltalánosabb előforduló típusra konvertál, a következő sorrendet követve: logikai, egész, dupla, karakter. Egy beágyazott lista, amely számokat és szöveget kever, ezért teljes egészében szövegként tér vissza. Az eredmény nevei a külső és belső címkék összekapcsolásával épülnek fel, ezért érkezik egy elem meta.ownerként, és nem ownerként.

Adja át a use.names = FALSE értéket, ha ezek az összetett nevek nemkívánatosak, és állítsa a recursive = FALSE értéket, ha csak a legkülső réteget kell eltávolítani. Ha az értékeknek meg kell tartaniuk a típusukat, akkor hagyja érintetlenül a struktúrát, és a lista lapítása helyett haladjon végig rajta.

Beépített adatkeret R-ben

A listákat gyakran lemezről vagy a webről beolvasott adatokkal töltik meg, ezért hasznos látni, hogyan érkezik meg egy adatkeret, mielőtt az egyben tárolódna. Mielőtt létrehoznánk saját adatkeretünket, megnézhetjük az online elérhető R adatkészletet. A börtönadatkészlet egy 714×5 dimenziós. A tail() függvénnyel gyorsan áttekinthetjük az adatkeret alját. Hasonlóképpen, a head() az adatkeret tetejét jeleníti meg. A head(df, 5) függvénnyel megadhatjuk a megjelenített sorok számát. A read.csv() függvénnyel többet is megtudunk majd a következő részben. adatok importálása R-ben tutorial.

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

output:

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

A read.csv() függvényt követő [1:5] az első öt oszlopot választja ki, nem az első öt sort, mivel egy adatkeret maga is oszlopok listája. Egy lista egyetlen zárójeles indexelése egy kisebb listát ad vissza, és itt ez a kisebb lista továbbra is egy adatkeret.

Az adatkeret szerkezetét az str-vel ellenőrizhetjük:

# Structure of the data
str(df)

output:

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

Minden változó a számszerű formátum. Az egyes sorokban található $ előtag ugyanaz az operátor, amelyet korábban a névvel ellátott listákon használtak, ami megerősíti, hogy egy adatkeret egyenlő hosszúságú oszlopok listája, amelyek téglalap alakú címkével vannak ellátva. A listaelemek elnevezéséről, kiválasztásáról és törléséről tanultak tehát közvetlenül átvihetők a következőbe: R adattípusok és az adatkeret oszlopaihoz.

GYIK

Egy vektor minden elemet egy típusba kényszerít, így a szöveg és a számok keverése mindent karakterré tesz. Egy lista minden elemet pontosan a megadott formában tart meg, beleértve a vektorokat, mátrixokat és a különböző hosszúságú függvényeket is. A typeof() függvénnyel különböztethetjük meg a kettőt.

Hívjuk meg az is.list(x) függvényt, amely TRUE értéket ad vissza listák és párosított listák esetén. A class(x) az objektumosztályt adja vissza, míg a typeof(x) „list” értéket ad vissza adatkeretek esetén is, mivel egy adatkeret alatta egyenlő hosszúságú oszlopok listája.

A length(my_list) csak a legfelső szintű elemeket számolja, így egy beágyazott lista is egynek számít. A lengths(my_list) egyetlen hívásban minden elem méretét visszaadja, ami gyorsabb és áttekinthetőbb, mint a loo.ping amikor az elemek különböznek.

lapply(my_list, FUN) alkalmaz egy funkció minden elemre vonatkozik, és egy listát ad vissza. Az apply() ahol lehetséges, vektorra vagy mátrixra egyszerűsíti az eredményt. Egy egyszerű for ciklus a seq_along(my_list) függvény felett szintén működik és tisztán olvasható.

Amikor minden elem azonos hosszúságú, az as.data.frame(my_list) közvetlenül működik. Azonos szélességű sorok listájának esetén a do.call(rbind, my_list) először egymásra rakja őket. dplyr Az ökoszisztéma az as_tibble() függvényt kínálja, ha az oszloptípusoknak érintetlenül kell fennmaradniuk.

A listák nem tartalmaznak beépített rendezést, így pl.tracelőször az összehasonlítható kulcs: my_list[order(sapply(my_list, length))] elemméret szerint rendez újra. Téglalap alakú adatok esetén konvertáld keretté, és rendezd az adatkeretet helyette az order() függvényt használjuk.

Az AI asszisztensek beolvassák az str() kimenetét, és elmagyarázzák, miért adott vissza egy index NULL értéket vagy egy allistát érték helyett. Javaslatot tesznek a helyes zárójelformára, megrajzolják a lapply() folyamatokat, és jelzik a csendes típuskényszerítést, mielőtt az torzítaná az eredményt.

Igen. GitHub másodpilóta dolgozik RStudio 2023.09.0 és későbbi verziók esetén az Eszközök, Globális beállítások menüpontban, majd a kódsegéd beállításával. A list(), names() és unlist() hívásokat egy megjegyzésből hajtja végre, bár minden javaslatot továbbra is ellenőrizni kell.

Foglald össze ezt a bejegyzést a következőképpen: