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.

  • ๐Ÿงบ Mjeลกovito skladiลกtenje: Lista sadrลพi objekte razliฤitih tipova i duljina, ลกto obiฤan vektor ne moลพe.
  • ๐Ÿ› ๏ธ Korak izgradnje: list(vect, mat, df) pakira vektor, matricu i okvir podataka u jedan objekt.
  • ๐Ÿ”ข Pristup poziciji: my_list[[2]] vraฤ‡a sam element, dok my_list[2] vraฤ‡a listu s jednim elementom.
  • ๐Ÿท๏ธ Imenovani elementi: Oznaฤavanje elemenata prilikom kreiranja omoguฤ‡uje pristup putem operatora $ ili [[โ€œnameโ€]].
  • โœ๏ธ Ureฤ‘ivanje na licu mjesta: Ponovno dodjeljivanje aลพurira element, a dodjeljivanje NULL-a ga uklanja s popisa.
  • ๐Ÿ”— Ravnanje: unlist() saลพima ugnijeลพฤ‘enu listu u jedan atomski vektor za daljnju analizu.

R lista Stvaranje liste u R programiranju i odabir elemenata

ล 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.

Pitanja i odgovori

Vektor prisiljava svaki element da dijeli jedan tip, pa mijeลกanje teksta i brojeva sve prisiljava na karakter. Lista ฤuva svaki element toฤno onako kako je naveden, ukljuฤujuฤ‡i vektore, matrice i funkcije razliฤitih duljina. Koristite typeof() da biste ih razlikovali.

Pozovite is.list(x), koja vraฤ‡a TRUE za liste i pairliste. class(x) izvjeลกtava klasu objekta, dok typeof(x) vraฤ‡a "list" ฤak i za podatkovne okvire, jer je podatkovni okvir popis stupaca jednake duljine ispod.

length(my_list) broji samo elemente najviลกe razine, tako da se ugnijeลพฤ‘ena lista i dalje raฤuna kao jedna. lengths(my_list) izvjeลกtava veliฤinu svakog elementa u jednom pozivu, ลกto je brลพe i jasnije od looping kada se elementi razlikuju.

lapply(my_list, FUN) primjenjuje funkcija svakom elementu i vraฤ‡a popis. sapply() pojednostavljuje rezultat na vektor ili matricu gdje je to moguฤ‡e. Jednostavna for petlja preko seq_along(my_list) takoฤ‘er radi i jasno se ฤita.

Kada svaki element ima istu duljinu, as.data.frame(my_list) radi izravno. Za popis redaka jednake ลกirine, do.call(rbind, my_list) ih prvo slaลพe. dplyr Ekosustav nudi as_tibble() kada tipovi stupaca moraju ostati netaknuti.

Liste nemaju ugraฤ‘eno sortiranje, pa npr.tracPrvo usporedite kljuฤ: my_list[order(sapply(my_list, length))] preureฤ‘uje prema veliฤini elementa. Za pravokutne podatke, pretvorite u okvir i sortiraj okvir podataka s order() umjesto toga.

AI asistenti ฤitaju izlaz str() i objaลกnjavaju zaลกto je indeks vratio NULL ili podlistu umjesto vrijednosti. Takoฤ‘er predlaลพu ispravan oblik zagrada, skiciraju lapply() cjevovode i oznaฤavaju tihu prisilu tipa prije nego ลกto oลกteti rezultat.

Da. GitHub kopilot radi u RStudio 2023.09.0 i novije verzije putem Alata, Globalnih opcija, a zatim postavke pomoฤ‡nika za kod. Dovrลกava pozive list(), names() i unlist() iz komentara, iako svaki prijedlog i dalje treba pregledati.

Saลพmite ovu objavu uz: