Práce se seznamy v R
Z WikiSkript
Seznam (list) je výčtem prvků, které mohou být různorodého datového typu, včetně listu samotného.
Délky jednotlivých prvků seznamu se mohou lišit a seznam může obsahovat i další vnořené seznamy.
Užitečné příkazy[upravit | editovat zdroj]
Seznam se tvoří příkazem list()
. Úvod k seznamům je na stránce Datové struktury. Zde budeme pokračovat.
# máme seznam různých věcí
mujseznam <- list("a" = c(1:10), "b" = mtcars, "c" = matrix(1:8, 2), "z" = "ahoj")
# mrkneme na popisky prvků
names(mujseznam)
#> [1] "a" "b" "c" "z"
# přejmenujeme popisky
# LETTERS je vektor obsahující všechna velká písmena anglické abecedy
names(mujseznam) <- LETTERS[ 1:length(mujseznam) ]
names(mujseznam)
#> [1] "A" "B" "C" "D"
# přidání vektoru c(T, F) k listu "mujseznam"
# všimněte si, že adresa prvku je v dvojitých hranatých závorkách
mujseznam[[length(mujseznam) + 1]] <- c(T, F)
# nový prvek pojmenujeme "XY"
names(length(mujseznam)) <- "XY"
Indexování a adresace[upravit | editovat zdroj]
Jak se odkážeme na nějaký konkrétní prvek seznamu? Na rozdíl od ostatních proměnných je zde adresa prvku někdy uzavřena ve dvou hranatých závorkách.
# zobrazíme druhý prvek seznamu
mujseznam[[2]]
# zobrazíme prvek seznamu pod jmenovkou "B",
# ukáže se původní prvek s původním datovým typem (zde je to data.frame mtcars)
mujseznam[["B"]]
# nebo jinak:
mujseznam$B
# pozor, teď zobrazíme prvek seznamu pod jmenovkou "B",
# ale když je adresa v jedněch hranatých závorkách,
# ukáže se původní prvek s datovým typem "seznam"
mujseznam["B"]
class(mujseznam["B"])
#> [1] "list"
class(mujseznam[["B"]])
#> [1] "data.frame"
# zobrazíme druhý a čtvrtý prvek seznamu
mujseznam[c(2, 4)]
# 2. prvek 1. prvku listu
mujseznam[[1]][2]
#> [1] 2
# z 2. prvku listu vybírám prvek o souřadnicích (3, 5)
mujseznam[[2]][3, 5]
#> [1] 3.85
Indexování a adresace pomocí funkce lapply()[upravit | editovat zdroj]
Trochu komplikovanější příklady s funkcí lapply(), která vrací seznam prvků zpracovaných zadaným způsobem.
# vyrobíme si náhodný seznam náhodných čísel
# nastavení
set.seed(1)
# vytvořím dlouhý seznam
dlouhy_seznam <- lapply(
# vektor 100 náhodných čísel od 80 do 120
sample(c(80:120), 100, TRUE),
# funkce, která vyrobí pro každý prvek (n) výše uvedeného vektoru
# seznam (n) čísel od 50 do 150
function(x) sample(
c(50:150), x, replace = TRUE
)
)
# vznikl nám náhodný seznam o 100 prvcích - vektorech,
# z nichž každý je náhodně dlouhý (o 80-120 prvcích)
# a obsahuje čísla od 50 do 150
# z každého prvku listu (vektoru) vybírám jen jeho 14. prvek
lapply(dlouhy_seznam, "[[", 14)
Někdy chceme zjistit agregované ukazatele nad všemi prvky seznamu.
lapply(dlouhy_seznam, mean) # pro každý prvek listu (vektor) vracím jeho průměr
lapply(dlouhy_seznam, length) # pro každý prvek listu (vektor) vracím jeho délku