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