Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyAnalýza dat v R Datové struktury Datová tabulka

Logo Matematická biologie

Datová tabulka

V datové tabulce je třeba brát ohled na to, že jednotlivé sloupce nemusí být stejné třídy. Jeden může být číslo, druhý může být logická hodnota, atd. Data v rámci každého sloupce jsou však stejné třídy (číslo, znak, logická hodnota).  Je to typický formát dat, se kterým přichází výzkumník za analytikem.

Vytvořme si vzorovou tabulku:

> vek <- c(57,81,45)
> lecba <- c("CHT","zadna","CHT")
> umrti <- c(F,T,F)
> IDpacienta <- c("ID01","ID26","ID98")
> X <- data.frame(vek,lecba,umrti,row.names=IDpacienta)
> X

            vek   lecba      umrti
ID01        57    CHT        FALSE
ID26        81    zadna      TRUE
ID98        45    CHT        FALSE

Řádky datové tabulky jsou uložené jako listy, sloupce jako vektory.

[1] "numeric" "vector"

> is(X[1])
<span style="color: " #0000ff"="">[1] "data.frame" "list"       "oldClass"   "vector"

Častá chyba v úpravě dat pochází z nevědomosti toho, že data.frame automaticky mění vektor znaků na faktor:

>  X$lecba
[1] CHT    zadna CHT   
Levels: CHT zadna

>  class(X$lecba)
[1]
"factor" 

Přesvědčíme se, jaká byla třída původního vektoru:

>  class(lecba)
[1]
"character"   

Funkce levels() vypíše úrovně faktoru. Funkce nlevels zas počet úrovní faktoru:

>  levels(X$lecba)
[1]
"CHT"  "zadna"
>  nlevels(X$lecba)
[1]
2

Při neznalosti toho, jak data.frame pracuje s třídou jednotlivých sloupců může nastat zásadní chyba při zpracování objemných datových souborů. Data.frame totiž vektor znaků automaticky mění na faktor. To samo o sobě problémem není, ale může se stát. Uveďme si příklad:

Řekněme, že chceme vypočítat průměrný věk pacienta. Pokud věk nebude zadán jako číslo ale jako vektor znaků a my budeme chtít vypočítat průměrný věk pacienta, dojde k následujícímu:

> vek <- c("57","81","45")
> X <- data.frame(vek,lecba,umrti,row.names=IDpacienta)


> mean(X$vek)
[1] NA
Warning message:
In mean.default(X$vek) : argument is not numeric or logical: returning NA

Přečteme si chybovou hlášku a zjistíme, že argument není číslem, budeme si myslet, že to z nějakého důvodu načetlo jako znak a budeme se snažít situaci napravit pomocí funkce as.numeric():

> mean(as.numeric(X$vek))
[1] 2

V tuto chvíli nám je jasné, že jsme udělali chybu, neboť průměrný věk 2 je jistě nepravděpodobný. Zatímco proměna vektoru znaků ve vektor čísel, a tedy i následný výpočet průměru může proběhnout v pořádku:

> as.numeric(vek)
[1] 57 81 45
> mean(as.numeric(vek))
[1] 61

... proměna faktoru ve vektor čísel je v tomto případě problematická, protože as.numeric() aplikována na faktor vrátí pořadí úrovně dané hodnoty. Čísla nejsou ve faktoru brána jako čísla, ale jako úrovně. 45 představuje tedy první úroveň faktoru, 57 druhou úroveň a 81 třetí úroveň:

> levels(X$vek)
[1]"45" "57" "81"

Proměna na vektor čísel pak vyústí ve vektor čísel představující pořadí úrovně faktoru:

> as.numeric(X$vek)
[1] 1 3 2

No a samozřejmě průměrný věk vypočtený z těchto pořadí nemá nic dočinění se správnou hodnotou.

Někdy však není tato chyba patrná, hodnoty se nevymykají normálu a my chybu přehlédneme. Přeměna čísla na faktor se stává tehdy, má-li sloupec s číselnými hodnotami nějakou hodnotu textovou, což se stává u chybějících hodnot (například "není znám", "nezjištěno" a podobně.),ale může se jednat i o překlep. Při automatickém načítání se tento sloupec bere tedy jako vektor znaků a promění se ve faktor.

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity