Liste u R programiranju: Kako stvoriti i odabrati elemente
โก Pametni saลพetak
R Lista je objekt koji pohranjuje vektore, matrice, okvire podataka, pa ฤak i druge liste unutar jednog spremnika. Funkcija list() je gradi, a dvostruke uglate zagrade izvlaฤe bilo koji element natrag.

ล to je R lista?
R popis je objekt u R programiranju koji ukljuฤuje matrice, vektore, podatkovne okvire ili popise unutar sebe. R List se takoฤer koristi za pohranjivanje kolekcije objekata i njihovu upotrebu kada su nam potrebni. R listu moลพemo zamisliti kao torbu za stavljanje mnogo razliฤitih predmeta. Kada trebamo upotrijebiti predmet, moลพemo otvoriti vreฤicu i upotrijebiti ga.
Kontrast s vektorom je ono ลกto vreฤicu ฤini korisnom. Vektor prisiljava svaki element u jedan tip, pa postavljanje rijeฤi pored broja pretvara broj u tekst. Lista ne primjenjuje takvo pravilo, zbog ฤega moลพe nositi vektor s pet elemenata, dvoredni matrica i podatkovni okvir od 714 redaka jedan pored drugog bez promjene bilo kojeg od njih.
Sintaksa liste u R
Funkciju list() moลพemo koristiti za stvaranje popisa u R programiranju:
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
Svaki argument moลพe se prenijeti sam ili u obliku oznaka = vrijednostGoli argument postaje pozicijski element dostupan samo po svom broju, dok oznaฤeni argument takoฤer dobiva ime. Osnovna R referenca za popis() dokumentira i obrasce i napominje da unlist() djeluje kao pribliลพna inverza as.list().
Kako stvoriti popis u R
Ispod je korak po korak postupak stvaranja popisa u R-u:
U donjem primjeru stvorit ฤemo tri razliฤita objekta, vektor, matricu i a Okvir podataka koristeฤi funkciju liste u R.
Korak 1) Stvorite vektor
Koristite donji kod za stvaranje vektora u R
# Vector with numeric from 1 up to 5
vect <- 1:5
Operator dvotoฤke gradi niz 1, 2, 3, 4, 5 kao cjelobrojni vektor, a strelica dodjeljivanja ga pohranjuje pod imenom vect.
Korak 2) Napravite matricu
Sada kreirajte matricu koristeฤi sljedeฤi kod
# A 2x 5 matrix
mat <- matrix(1:9, ncol = 5)
dim(mat)
Ovdje treba obratiti pozornost na dva detalja. Mreลพa od dva retka s pet stupaca treba deset vrijednosti, a ipak je navedeno samo devet, pa R reciklira niz i ispisuje upozorenje da duljina podataka nije podmnoลพak broja redaka. Ta reciklirana vrijednost je razlog zaลกto drugi redak ispisane matrice zavrลกava s 1, a ne s 10. Poziv funkcije dim() zatim izvjeลกtava o obliku.
Izlaz:
## [1] 2 5
Korak 3) Stvorite podatkovni okvir
Stvorite podatkovni okvir u R koristeฤi donji kod
# select the 10th row of the built-in R data set EuStockMarkets
df <- EuStockMarkets[1:10,]
Komentar spominje deseti redak, ali izraz zadrลพava retke od 1 do 10 ugraฤenog EuStockMarkets niza. Podskupljavanjem se takoฤer uklanja klasa vremenskog niza, pa se vraฤa numeriฤka matrica, a ne pravi okvir podataka, ลกto je upravo razlog zaลกto ispisani rezultat u nastavku sadrลพi oznake redaka u stilu [1,] umjesto naziva redaka. Poziv se omota u as.data.frame() kad god je potreban pravi okvir podataka.
Korak 4) Napravite popis u R
Sada, moลพemo staviti tri objekta na R listu koristeฤi donji kod
# Construct list with these vec, mat, and df:
my_list <- list(vect, mat, df)
my_list
Izlaz:
## [[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
Tri zaglavlja s dvostrukim zagradama u tom izlazu predstavljaju pozicije na listi. Niลกta nije izravnano ili prisiljeno: element jedan je i dalje cjelobrojni vektor, element dva je i dalje matrica, a element tri i dalje sadrลพi svih deset redaka cijena dionica.
Odaberite elemente s popisa R
Nakon ลกto smo izgradili naลกu listu, moลพemo joj pristupiti priliฤno lako. Za odabir elementa na listi trebamo koristiti [[index]]. Vrijednost unutar dvostruke uglate zagrade predstavlja poziciju elementa na listi koju ลพelimo prikazati.tracNa primjer, ako u zagrade unesemo 2, R vraฤa drugi navedeni element.
Sada u ovome R tutorial, pokuลกajmo odabrati drugu stavku popisa u R pod nazivom my_list, koristimo my_list[[2]]
# Print second element of the list
my_list[[2]]
Izlaz:
## [,1] [,2] [,3] [,4] [,5] ## [1,] 1 3 5 7 9 ## [2,] 2 4 6 8 1
Jednostruke i dvostruke zagrade nisu zamjenjive, a njihovo mijeลกanje najฤeลกฤi je izvor pogreลกaka u listi. Jedna zagrada zadrลพava omotaฤ, dvije ga uklanjaju.
| Izraz | ล to se vraฤa | Klasa rezultata | Koristite ga kada |
|---|---|---|---|
| moj_popis[[2]] | Sam pohranjeni element | ล to god je bilo pohranjeno, ovdje je matrica | Morate raฤunati na temelju jednog elementa |
| moj_popis[2] | Podlista koja sadrลพi taj jedan element | popis | Morate zadrลพati omot liste |
| moj_popis[c(1, 3)] | Podlista odabranih elemenata | popis | Trebate nekoliko elemenata odjednom |
| moj_popis[-2] | Svaki element osim drugog | popis | Morate ispustiti 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]
Imenovane liste u R-u
Pozicijski indeksi su krhki: umetnite jedan element i svaki broj nakon njega se pomiฤe. Imenovanje elemenata uklanja taj rizik i ฤini da se kod ฤita kao podaci koje opisuje. Imena se mogu navesti prilikom izrade popisa ili se mogu dodati naknadno pomoฤu funkcije 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"
Operator $ i dvostruka zagrada razlikuju se u jednom aspektu koji poฤetnike izdvaja. Operator $ izvodi djelomiฤno podudaranje, pa named_list$pri i dalje pronalazi cijene, dok named_list[[โpriโ]] vraฤa NULL jer se dvostruke zagrade toฤno podudaraju osim ako se ne proslijedi exact = FALSE. Djelomiฤno podudaranje je praktiฤno u konzoli, a nesigurno u skripti, pa je u spremljenom kodu poลพeljniji toฤan oblik.
# A compact map of the whole structure
str(named_list)
str() ispisuje jedan redak po elementu s njegovim tipom i veliฤinom, ลกto je najbrลพi naฤin da potvrdite da lista sadrลพi ono ลกto oฤekujete prije indeksiranja u nju.
Izmjena, dodavanje i brisanje elemenata u R listi
Popis nije fiksan nakon ลกto je stvoren. Isti pristupnici koji ฤitaju element takoฤer i piลกu na njega, tako da aลพuriranje, proลกirivanje i smanjivanje popisa koriste obiฤno dodjeljivanje.
# 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
- Zamijeniti: Dodjeljivanje postojeฤem imenu prepisuje taj element i ostavlja njegovu poziciju nepromijenjenom.
- Dodaj: Dodjeljivanjem imenu koje ne postoji dodaje se novi element na kraj liste.
- Dodati: append() uzima listu kao svoj drugi argument, pa stoga u list() omotajte golu vrijednost prije nego ลกto je proslijedite.
- Izbrisati: Dodjeljivanje NULL vrijednosti s dvostrukim zagradama uklanja element i skraฤuje listu.
Jedna posljedica redovito zbunjuje ljude: buduฤi da NULL znaฤi brisanje, ne moลพete pohraniti stvarni NULL s dvostrukim zagradama. Umjesto toga koristite dodjeljivanje s jednom zagradom, kao u named_list[โemptyโ] <- list(NULL), ลกto zadrลพava mjesto i stavlja NULL unutar njega.
Ugnijeลพฤene liste i unlist() u R-u
Buduฤi da lista moลพe sadrลพavati bilo koji R objekt, moลพe sadrลพavati i drugu listu. Ugnijeลพฤivanje je naฤin na koji se konfiguracijski objekti, JSON odgovori i rezultati modela obiฤno predstavljaju u R-u, pa su dosezanje ugnijeลพฤene liste i njezino izravnavanje svakodnevni zadaci.
# 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)
Spljoลกtavanje ima cijenu koju vrijedi razumjeti. unlist() mora vratiti jedan atomski vektor, pa svaku vrijednost prisiljava na najopฤenitiji prisutni tip, slijedeฤi redoslijed logiฤki, cijeli broj, dvostruki, znak. Ugnijeลพฤena lista koja mijeลกa brojeve s tekstom stoga se u cijelosti vraฤa kao tekst. Imena rezultata grade se spajanjem vanjskih i unutarnjih oznaka, zbog ฤega element dolazi kao meta.owner, a ne owner.
Proslijedite use.names = FALSE kada ta sloลพena imena nisu poลพeljna, a postavite recursive = FALSE kada treba ukloniti samo najudaljeniji sloj. Ako vrijednosti moraju zadrลพati svoje tipove, ostavite strukturu netaknutom i proฤite kroz popis umjesto da ga izravnate.
Ugraฤeni podatkovni okvir u R
Popisi se ฤesto pune podacima proฤitanim s diska ili s weba, stoga je korisno vidjeti kako okvir podataka stiลพe prije nego ลกto se pohrani unutar njega. Prije stvaranja vlastitog okvira podataka, moลพemo pogledati skup podataka R dostupan online. Skup podataka zatvora ima dimenziju 714 ร 5. Moลพemo brzo pogledati dno okvira podataka pomoฤu funkcije tail(). Po analogiji, head() prikazuje vrh okvira podataka. Moลพete odrediti broj prikazanih redaka pomoฤu head(df, 5). Viลกe o funkciji read.csv() saznat ฤemo u uvoz podataka u R udลพbenik.
PATH <-'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/prison.csv'
df <- read.csv(PATH)[1:5]
head(df, 5)
Izlaz:
## 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] koji slijedi nakon read.csv() odabire prvih pet stupaca, a ne prvih pet redaka, jer je sam okvir podataka popis stupaca. Indeksiranje s jednom zagradom na popisu vraฤa manji popis, a ovdje je taj manji popis i dalje okvir podataka.
Moลพemo provjeriti strukturu podatkovnog okvira pomoฤu str:
# Structure of the data
str(df)
Izlaz:
## '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 ...
Sve varijable su pohranjene u numeriฤki formatu. Prefiks $ u svakom retku je isti operator koji se ranije koristio na imenovanim popisima, ลกto potvrฤuje da je okvir podataka popis stupaca jednake duljine s pravokutnom oznakom. Sve ลกto je nauฤeno o imenovanju, odabiru i brisanju elemenata popisa stoga se izravno prenosi na R tipovi podataka i na stupce okvira podataka.
