3.6 Základní datové struktury

Základní datové struktury lze roztřídit podle dvou charakteristik: 1) podle jejich dimensionality (jednorozměrné, dvourozměrné atd.) a 2) zda jsou všechny jejich položky stejného datového typu (tj. struktura je homogenní), nebo zda je heterogenní.

dimenze homogenní heterogenní
1 atomický vektor seznam
2 matice dataset
více pole \(\strut\)

3.6.1 Atomické vektory

Nejzákladnější datovou strukturou je v R atomický vektor. R nemá datovou strukturu pro skalár (jedinou logickou hodnotu, jediné číslo, znak nebo řetězec) – každý skalár je ve skutečnosti atomický vektor s jediným prvkem.

Atomický vektor je vektor hodnot, jehož všechny prvky mají stejný typ (např. celé číslo). Atomické vektory se vytvářejí funkcí c() (od “concatenate”), která “slepí” jednotlivé hodnoty dohromady, přičemž provede automatickou konverzi (pokud je potřeba).

x <- c(1, 2, 3, 17)
print(x)
## [1]  1  2  3 17

Pomocí funkce c() je možné “slepit” i celé vektory:

x1 <- c(1, 2, 3)
x2 <- c(4, 5, 6, NA)
x <- c(x1, x2)
print(x)
## [1]  1  2  3  4  5  6 NA

Všechny prvky atomického vektoru musejí mít stejný typ. Pokud tedy při tvorbě atomického vektoru smícháte proměnné různých typů, dojde k automatické konverzi:

c(TRUE, 1, "ahoj")  # výsledek je vektor tří řetězců
## [1] "TRUE" "1"    "ahoj"

Jednotlivé prvky atomických vektorů mohou mít jména. Jména jsou uložena jako atribut names. Je možné je zadat třemi způsoby: přímo ve funkci c(), pomocí funkce attr() nebo pomocí speciální funkce names():

x <- c(a = 1, "good parameter" = 7, c = 17)
x
##              a good parameter              c 
##              1              7             17
attr(x, "names") <- c("A", "Good Parameter", "C")
x
##              A Good Parameter              C 
##              1              7             17
names(x) <- c("aa", "bb", "cc")
names(x)
## [1] "aa" "bb" "cc"
x
## aa bb cc 
##  1  7 17

Pokud mají jednotlivé prvky vektorů přiřazená jména, vypisují se na obrazovku nad vlastní hodnoty.

Délku vektoru je možné zjistit pomocí funkce length():

length(x)
## [1] 3

Pozor: atomický vektor může mít i nulovou délku, pokud neobsahuje žádné prvky. (Podobně i další datové struktury mohou mít nulové rozměry, např. nulový počet řádků apod.) Prázdný vektor vznikne často tak, že z existujícího vektoru vyberete hodnoty pomocí podmínky, kterou žádný prvek vektoru nesplní (jak se vybírá část datové struktury uvidíte později):

x <- 1:9
y <- x[x > 10]  # vybereme prvky větší než 10, viz dále
length(y)
## [1] 0
y
## integer(0)

Prázdný vektor je možné vytvořit pomocí konstruktorových funkcí logical(), integer(), numeric(), character() apod., které mají jediný parametr: počet prvků. Pokud je zadaný počet prvků nulový, funkce vrátí prázdný vektor.

z <- numeric(0)  # parametr je délka vektoru

Některé vektory obsahují předvídatelné sekvence čísel. Pro vytváření takových vektorů existuje operátor dvojtečka (:) a speciální funkce:

1:10   # vektor celých čísel 1 až 10
##  [1]  1  2  3  4  5  6  7  8  9 10
10:1   # vektor celých čísel sestupně 10 až 1
##  [1] 10  9  8  7  6  5  4  3  2  1
# sekvence od ... do
seq(from = 1, to = 10, by = 3)  # s daným krokem
## [1]  1  4  7 10
seq(from = 1, to = 10, length.out = 4)  # s danou délkou výsledku
## [1]  1  4  7 10
seq_along(c(1, 3, 17, 31))  # celá čísla od 1 do délky zadaného vektoru
## [1] 1 2 3 4
seq_len(7)  # celá čísla od 1 nahoru se zadanou nezápornou délkou
## [1] 1 2 3 4 5 6 7
# opakování hodnot ve vektoru
rep(c(1, 3), times = 5)  # celý vektor 5 krát
##  [1] 1 3 1 3 1 3 1 3 1 3
rep_len(c(1, 3), length.out = 5)  # celý vektor do délky 5
## [1] 1 3 1 3 1
rep(c(1, 3), each = 3)  # každý prvek 3 krát
## [1] 1 1 1 3 3 3
rep(1:6, each = 2, times = 3)
##  [1] 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3 4 4 5 5 6
## [36] 6

Složitější varianty použití funkce rep() viz dokumentace.

Pozor! Konstrukce vektorů pomocí operátoru dvojtečka je někdy nebezpečná. Řekněme, že chcete provést nějakou operaci pro každý prvek vektoru x a že to chcete udělat pomocí cyklu for (viz později). Při psaní cyklů se často prochází hodnoty pomocného vektoru k = 1:length(x). Pokud má vektor x kladnou délku, je vše v pořádku. Pokud však vektor x neobsahuje žádné hodnoty, pak má nulovou délku. Čekali bychom, že pomocný vektor k bude mít také nulovou délku, takže cyklus neproběhne ani jednou. To však není pravda. Vektor k je v tomto případě zkonstruován jako 1:0, má tedy hodnotu c(1, 0) a délku 2! Taková věc je zdrojem špatně dohledatelných chyb. Je lepší použít k = seq_along(x). Ještě lepší je cyklům se vyhýbat. R k tomu má velmi užitečné funkce typu apply(), viz dále.

Na obrazovku se vektory vypisují tak, že se jejich jednotlivé hodnoty skládají vedle sebe do řádku. Pokud se všechny hodnoty na řádek nevejdou, začne se vypisovat na dalším řádku. Každý řádek je uvozen číslem v hranatých závorkách. To je index prvního prvku vektoru na daném řádku. Protože jsou prvky vektorů číslované přirozenými čísly (tj. první prvek má index 1), bude první řádek začínat [1]. Pokud další řádek začíná např. [31], znamená to, že první číslo na daném řádku je 31. prvek daného vektoru atd.

Poznámka: I když se vektory vypisují na obrazovku po řádcích, neznamená to že jsou v R vektory řádkové – nejsou ani řádkové, ani sloupcové (jako je to implicitně třeba v Matlabu). Hodnoty se vypisují po řádcích prostě pro úsporu místa.

Veškeré aritmetické a logické operace se na vektorech provádí po prvcích:

x <- 1:6
y <- 2:7
x * y
## [1]  2  6 12 20 30 42
x ^ 2
## [1]  1  4  9 16 25 36

Pozor: pokud se délka vektorů liší, pak R automaticky “recykluje” kratší vektor, tj. opakuje jeho hodnoty znovu a znovu (při tom vydá R varování jen v případě, že délka delšího vektoru není celočíselným násobkem délky kratšího vektoru):

x <- 1:2
y <- 1:6
x + y
## [1] 2 4 4 6 6 8
x * y
## [1]  1  4  3  8  5 12
y <- 1:7
x + y
## Warning in x + y: longer object length is not a multiple of shorter object
## length
## [1] 2 4 4 6 6 8 8

K otestování, zda je proměnná atomický vektor slouží funkce is.atomic():

is.atomic(x)
## [1] TRUE

Pozor: existuje i funkce is.vector(). Ta však vrací logickou hodnotu TRUE nejen pro atomický vektor, ale i pro neatomický vektor (seznam), viz dále:

is.vector(x)
## [1] TRUE

3.6.2 Atomické matice

Atomická matice je matice (tj. dvourozměrná tabulka), jejíž všechny prvky mají stejný datový typ (např. celé číslo). Pro datovou analýzu nejsou matice příliš důležité, někdy se však hodí pro rychlou maticovou algebru a také některé funkce vracejí nebo očekávají jako vstup matice.

Nejjednodušší způsob, jak vytvořit atomickou matici je pomocí funkce matrix(). Prvním parametrem je vektor, který obsahuje data. Další parametry určují počet řádků a počet sloupců matice, způsob, jak budou data do matice skládaná (zda podle řádků či sloupců; implicitně se data do matic skládají po sloupcích) a pojmenování dimenzí matice. Není potřeba zadávat všechny parametry, pokud je jasné, jaké budou.

matrix(1:12, nrow = 3)  # matice se třemi řádky a čtyřmi sloupci, po sloupcích
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
matrix(1:12, ncol = 4, byrow = TRUE)  # stejný rozměr, data po řádcích
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12

Při tvorbě matic R recykluje data. To znamená, že pokud je zadaných hodnot méně, než vyžadují rozměry matice, R začne číst datový vektor znovu od začátku. To může být zdrojem nepříjemných chyb. Naštěstí R vypíše varování.

matrix(1:9, nrow = 3, ncol = 4)
## Warning in matrix(1:9, nrow = 3, ncol = 4): data length [9] is not a sub-
## multiple or multiple of the number of columns [4]
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7    1
## [2,]    2    5    8    2
## [3,]    3    6    9    3

Otestovat, zda je objekt matice, je možné pomocí funkce is.matrix(); převést data na matici je možné pomocí konverzní funkce as.matrix().

Zjistit rozměry matice je možné pomocí následujících funkcí: nrow() vrátí počet řádků matice, ncol() vrátí počet sloupců matice, dim() vrací vektor s počtem řádků a sloupců matice a length() vrací počet prvků matice. (Pro vektory vrací funkce nrow(), ncol() a dim() hodnotu NULL.)

m <- matrix(1:12, nrow = 3)
m
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
nrow(m)
## [1] 3
ncol(m)
## [1] 4
dim(m)
## [1] 3 4
length(m)
## [1] 12

Matice a podobné objekty je možné skládat pomocí funkcí rbind() a cbind(). První spojuje matice po řádcích (tj. skládá je pod sebe), druhá po sloupcích (tj. skládá je vedle sebe):

A <- matrix(1:12, nrow = 3)
B <- matrix(101:112, nrow = 3)
rbind(A, B)
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
## [4,]  101  104  107  110
## [5,]  102  105  108  111
## [6,]  103  106  109  112
cbind(A, B)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,]    1    4    7   10  101  104  107  110
## [2,]    2    5    8   11  102  105  108  111
## [3,]    3    6    9   12  103  106  109  112

Matice mohou mít následující atributy: dim je celočíselný vektor rozměrů (viz výše), jména řádků (čte i nastavuje se funkcí rownames()), jména sloupců (čte i nastavuje se funkcí colnames()) a jména dimenzí včetně jmen řádků a sloupců (čte i nastavuje se funkcí dimnames()):

rownames(A) <- c("a", "b", "c")
colnames(A) <- c("alpha", "beta", "gamma", "delta")
A
##   alpha beta gamma delta
## a     1    4     7    10
## b     2    5     8    11
## c     3    6     9    12
dimnames(A) <- list(id = c("A", "B", "C"), variables = c("Alpha", "Beta", "Gamma", "Delta"))
A
##    variables
## id  Alpha Beta Gamma Delta
##   A     1    4     7    10
##   B     2    5     8    11
##   C     3    6     9    12
attributes(A)
## $dim
## [1] 3 4
## 
## $dimnames
## $dimnames$id
## [1] "A" "B" "C"
## 
## $dimnames$variables
## [1] "Alpha" "Beta"  "Gamma" "Delta"

Atomická matice je implementována jako atomický vektor, který má přiřazený atribut dim, který je celočíselný vektor délky dva:

M <- 1:12
M
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
dim(M) <- c(3, 4)
M
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
is.matrix(M)
## [1] TRUE

Podobně lze zrušením atributu dim převést matici zpět na vektor (matice se vektorizuje po sloupcích).

dim(M) <- NULL
M
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12

Protože matice je atomický vektor, který má přiřazený atribut dim, funkce is.atomic() vrací pro matici hodnotu TRUE; funkce is.vector() však vrací překvapivě FALSE, protože testuje, zda je v proměnné uložen vektor.

M <- matrix(1:12, nrow = 3)
is.atomic(M)
## [1] TRUE
is.vector(M)
## [1] FALSE

3.6.2.1 Maticová aritmetika

Obyčejné symboly násobení (*), dělení (/) a umocňování (^) pracují “po prvcích”. Při násobení se např. vynásobí odpovídající prvky matice. Matice tedy musejí mít stejné rozměry (stejný počet řádků a sloupců).

A * B
##    variables
## id  Alpha Beta Gamma Delta
##   A   101  416   749  1100
##   B   204  525   864  1221
##   C   309  636   981  1344
A ^ 2
##    variables
## id  Alpha Beta Gamma Delta
##   A     1   16    49   100
##   B     4   25    64   121
##   C     9   36    81   144

Pro skutečné maticové násobení se používá operátor %*%. Inverzní matici vrací funkce solve() (obecně tato funkce řeší soustavy lineárních rovnic). K transponování matice slouží funkce t(). Hlavní diagonálu matice vrací funkce diag().

Speciální matice:

diag(1, nrow = 3, ncol = 3)  # jednotková matice
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1
matrix(0, nrow = 3, ncol = 3)  # nulová matice (využívá recyklace)
##      [,1] [,2] [,3]
## [1,]    0    0    0
## [2,]    0    0    0
## [3,]    0    0    0

Příklad inverze:

M <- matrix(c(1:8, 0), nrow = 3)
invM <- solve(M)
E <- diag(1, nrow = nrow(M), ncol = ncol(M))
all.equal(M %*% invM, E)
## [1] TRUE
all.equal(invM %*% M, E)
## [1] TRUE

3.6.3 Atomická pole

Atomické pole je vícerozměrná tabulka (tabulka, která má víc než dva rozměry), jehož všechny prvky mají stejný datový typ.

Atomická pole se konstruují pomocí funkce array(). Zbytek viz dokumentace.

array(1:27, dim = c(3, 3, 3))
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   19   22   25
## [2,]   20   23   26
## [3,]   21   24   27

3.6.4 Neatomické vektory (seznamy)

Neatomické vektory (častěji nazývané seznamy) jsou vektory, jejichž jednotlivé prvky mohou mít různé datové typy, třeba i jiné seznamy. Seznamy se vytvářejí pomocí funkce list():

l <- list(1L, 11, 1:3, "ahoj", list(1, 1:3, "ahoj"))
l
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 11
## 
## [[3]]
## [1] 1 2 3
## 
## [[4]]
## [1] "ahoj"
## 
## [[5]]
## [[5]][[1]]
## [1] 1
## 
## [[5]][[2]]
## [1] 1 2 3
## 
## [[5]][[3]]
## [1] "ahoj"

Stejně jako atomické vektory, i seznamy mohou mít atribut names, tj. jednotlivé prvky seznamu mohou mít svá jména. Ta se přiřazují stejně jako v případě atomických vektorů:

l <- list(a = 1, b = "ahoj", c = 1:3, d = list(1:3, "ahoj"))
names(l)
## [1] "a" "b" "c" "d"
l
## $a
## [1] 1
## 
## $b
## [1] "ahoj"
## 
## $c
## [1] 1 2 3
## 
## $d
## $d[[1]]
## [1] 1 2 3
## 
## $d[[2]]
## [1] "ahoj"

Délku seznamu zjistíme pomocí funkce length():

length(l)
## [1] 4

K otestování, zda je proměnná seznam, slouží funkce is.list(l).

is.list(l)
## [1] TRUE
is.vector(l)
## [1] TRUE

Pozor: Funkce is.vector() vrací hodnotu TRUE i pro seznamy.

Seznamy jsou někdy užitečné samy o sobě; jejich hlavní význam však spočívá v tom, že se používají jako základ pro tvoru většiny objektů (v rámci objektů tříd typu S3).

3.6.4.1 Neatomické matice a pole

Pokud přiřadíme seznamu atribut dim, pak se seznam změní na neatomickou matici nebo pole. Je to obskurní struktura, ale někdy by se mohla hodit:

dim(l) <- c(2, 2)
l
##      [,1]   [,2]     
## [1,] 1      Integer,3
## [2,] "ahoj" List,2

Při výpisu na obrazovku jsou vektory vypsány jako typ a délka (např. Integer,3 znamená vektor celých čísel délky 3).

3.6.5 Datasety

Pro analýzu dat jsou nejdůležitější datovou strukturou datasety. R má několik implementací datasetů, základní se nazývá data.frame. Datasety jsou tabulky, jejichž řádky představují jednotlivá pozorování a sloupce jednotlivé proměnné. Fakticky se jedná o seznam atomických vektorů o stejné délce, které jsou spojené vedle sebe. Každý vektor (sloupec tabulky) může obsahovat proměnné jiného typu.

Řekněme, že chceme zaznamenat údaje o subjektech, které se zúčastnily nějakého experimentu. Pro každý subjekt pozorujeme jeho id, výšku a váhu. Pokud máme čtyři subjekty, můžeme vytvořit dataset např. takto:

experiment <- data.frame(id = c(1, 2, 3, 41),
                         vyska = c(158, 174, 167, 203),
                         vaha = c(51, 110, 68, 97))
experiment
##   id vyska vaha
## 1  1   158   51
## 2  2   174  110
## 3  3   167   68
## 4 41   203   97

Při zadávání vektorů do datasetu můžeme zadat jejich jména, která pak R vypíše. R samo přidá jména řádků (automaticky jim dá přirozená čísla od 1 do počtu pozorování).

Počet řádků datasetu zjistíme pomocí funkce nrow(), počet sloupců funkcí ncol() nebo length(); funguje i funkce dim():

nrow(experiment)    # počet řádků
## [1] 4
ncol(experiment)    # počet sloupců
## [1] 3
length(experiment)  # počet sloupců
## [1] 3
dim(experiment)     # vektor počtu řádků a sloupců
## [1] 4 3

I při konstrukci datasetů R recykluje proměnné, pokud není zadáno dost hodnot. Pokud jsou všechny naše subjekty muži, stačí zadat tuto hodnotu jen jednou – R ji zrecykluje.

experiment <- data.frame(id = c(1, 2, 3, 41),
                         gender = "muž",
                         vyska = c(158, 174, 167, 203),
                         vaha = c(51, 110, 68, 97),
                         zdravy = c(TRUE, TRUE, FALSE, TRUE),
                         stringsAsFactors = FALSE)
experiment
##   id gender vyska vaha zdravy
## 1  1    muž   158   51   TRUE
## 2  2    muž   174  110   TRUE
## 3  3    muž   167   68  FALSE
## 4 41    muž   203   97   TRUE

Při zadání dat do dataset pomocí funkce data.frame() R převede všechny řetězce na faktory. Této konverzi zabrání parametr stringsAsFactors = FALSE.

Datasety mají standardně tři atributy: class (jméno třídy – data set je totiž objekt), names obsahuje jména sloupců (tj. jednotlivých proměnných) a row.names obsahuje jména jednotlivých řádků (tj. pozorování, implicitně mají hodnoty 1, 2 atd.).

attributes(experiment)
## $names
## [1] "id"     "gender" "vyska"  "vaha"   "zdravy"
## 
## $row.names
## [1] 1 2 3 4
## 
## $class
## [1] "data.frame"

Jména řádků můžete zjistit i změnit pomocí funkcí rownames() a row.names(), jména sloupců pomocí funkcí colnames() nebo names():

colnames(experiment) <- c("id", "sex", "height", "weight", "healthy")
experiment
##   id sex height weight healthy
## 1  1 muž    158     51    TRUE
## 2  2 muž    174    110    TRUE
## 3  3 muž    167     68   FALSE
## 4 41 muž    203     97    TRUE

Jména řádků vypadají na první pohled jako dobrý způsob, jak uložit nějakou identifikaci pozorování, např. id subjektu v experimentu. Nedělejte to! Veškeré informace o pozorování ukládejte přímo do datasetu (do tabulky). Je to filosoficky správnější a i praktičtější: některé funkce, které se používají ke zpracování datasetů jména řádků odstraní. Stejně tak některé formáty, do kterých se data ukládají, jména řádků nepodporují, takže byste přišli o důležité informace. Naproti tomu jména sloupců (tj. proměnných) jsou bezpečná.

Pozor: R vám dovolí změnit i třídu objektu tím, že přepíšete atribut class (bud pomocí funkce attr() nebo funkce class()). Pak se však budou pro daný objekt volat jiné funkce a výsledek může být podivný. Nedělejte to, pokud nevíte, co děláte.

Někdy je užitečné moci převést dataset na matici a matici na dataset. K převodu datasetu na matici slouží funkce as.matrix() a data.matrix(). První převede všechny sloupce datasetu automatickou konverzí na stejný typ, a pak na matici. Druhá převede explicitní konverzí všechny sloupce na reálná čísla, a pak na matici. Při automatické konverzi můžeme skončit s řetězci, což nemusí být žádoucí; se explicitní konverzí na reálná čísla můžeme řetězce ztratit a faktory mohou být zavádějící (faktory se převedou na čísla jako při konverzi na celé číslo).

as.matrix(experiment)    # použije automatickou konverzi na stejný typ
##      id   sex   height weight healthy
## [1,] " 1" "muž" "158"  " 51"  " TRUE"
## [2,] " 2" "muž" "174"  "110"  " TRUE"
## [3,] " 3" "muž" "167"  " 68"  "FALSE"
## [4,] "41" "muž" "203"  " 97"  " TRUE"
data.matrix(experiment)  # použije explicitní konverzi na reálná čísla
## Warning in data.matrix(experiment): NAs introduced by coercion
##      id sex height weight healthy
## [1,]  1  NA    158     51       1
## [2,]  2  NA    174    110       1
## [3,]  3  NA    167     68       0
## [4,] 41  NA    203     97       1

Matici lze převést na dataset pomocí funkcí as.data.frame() i data.frame(). Pokud má matice pojmenované sloupce, jejich jména jsou v datasetu zachována; v opačném případě je R samo pojmenuje V1, V2 atd nebo X1, X2 atd.

M <- matrix(1:12, nrow = 3)
as.data.frame(M)
##   V1 V2 V3 V4
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12
data.frame(M)
##   X1 X2 X3 X4
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12
colnames(M) <- c("a", "b", "c", "d")
as.data.frame(M)
##   a b c  d
## 1 1 4 7 10
## 2 2 5 8 11
## 3 3 6 9 12
data.frame(M)
##   a b c  d
## 1 1 4 7 10
## 2 2 5 8 11
## 3 3 6 9 12

Někdy se hodí vytvořit dataset, který obsahuje všechny možné kombinace hodnot nějakého vektoru. K tomu slouží funkce expand.grid():

expand.grid(x = 1:3, y = factor(c("male", "female")), z = c(TRUE, FALSE))
##    x      y     z
## 1  1   male  TRUE
## 2  2   male  TRUE
## 3  3   male  TRUE
## 4  1 female  TRUE
## 5  2 female  TRUE
## 6  3 female  TRUE
## 7  1   male FALSE
## 8  2   male FALSE
## 9  3   male FALSE
## 10 1 female FALSE
## 11 2 female FALSE
## 12 3 female FALSE

3.6.6 Zjištění obsahu datové strukury

Ke zjištění struktury a obsahu datové struktury slouží funkce str(). Funkce vypíše třídu proměnné a zobrazí její strukturu.

n <- 1:12
str(n)
##  int [1:12] 1 2 3 4 5 6 7 8 9 10 ...
l <- list(a = 1, b = 1:3, "ahoj", d = list(1, 1:2, TRUE))
str(l)
## List of 4
##  $ a: num 1
##  $ b: int [1:3] 1 2 3
##  $  : chr "ahoj"
##  $ d:List of 3
##   ..$ : num 1
##   ..$ : int [1:2] 1 2
##   ..$ : logi TRUE
d <- data.frame(x = 1:12, y = c(TRUE, FALSE))
str(d)
## 'data.frame':    12 obs. of  2 variables:
##  $ x: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ y: logi  TRUE FALSE TRUE FALSE TRUE FALSE ...