Tabulky – data.frame, vytváření, načítání a ukládání do souborů

Pod tabulkou (data.frame) myslíme více sloupců (vektorů), všechny mají stejný počet řádků. Data.frame nejčastěji načteme ze souboru a následně data zpracujeme :-)

Načtení data.frame ze souboru

# načtení obyčejného textového souboru, první řádek je hlavička tabulky (názvy sloupců)
# hodnoty jsou odděleny mezerou - např. import tabulky z Praatu
data <- read.table("soubor.txt", header = TRUE, sep = " ")

# to samé, ale desetinná čísla jsou v českém formátu (desetinná čárka)
data <- read.table("soubor.txt", header = TRUE, sep = " ", dec = ",")

# načtení dat z Excelu
library(readxl)  # pokud není knihovna nainstalována, tak nejdříve zavolat: install.packages("readxl")
               # prvotní instalace vyžaduje internet
read_excel("soubor.xlsx", sheet = 1, col_names = TRUE) # 1. sešit souboru, tabulka s hlavičkou

Základní operace s data.frame

R má předdefinované interní ukázkové data.frame, např. airquality, sleep, anscombe či InsectSprays (více viz http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html)

Pojďme si pohrát s InsectSprays obsahujícím počty hmyzu v závislosti na typu postřiku.

data <- InsectSprays
head(data)     # prvních 6 řádků data.frame
##   count spray
## 1    10     A
## 2     7     A
## 3    20     A
## 4    14     A
## 5    14     A
## 6    12     A
tail(data)     # posledních 6 řádků
##    count spray
## 67    13     F
## 68    10     F
## 69    26     F
## 70    26     F
## 71    24     F
## 72    13     F
summary(data)  # souhrnné statistiky pro každý sloupec (u numerických kvantily, u faktorových počty)
##      count       spray 
##  Min.   : 0.00   A:12  
##  1st Qu.: 3.00   B:12  
##  Median : 7.00   C:12  
##  Mean   : 9.50   D:12  
##  3rd Qu.:14.25   E:12  
##  Max.   :26.00   F:12
str(data)      # počet řádků, typy sloupců a ukázka prvních hodnot
## 'data.frame':    72 obs. of  2 variables:
##  $ count: num  10 7 20 14 14 12 10 23 17 20 ...
##  $ spray: Factor w/ 6 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
nrow(data)     # počet řádků
## [1] 72
dim(data)      # počet řádků a sloupců
## [1] 72  2
names(data)    # zjištění názvů sloupců
## [1] "count" "spray"
names(data) <- c("count", "spray") # názvy sloupců si můžeme pojmenovat podle sebe
                                   # - užitečné, když tabulka nemá hlavičku

Tip: přehledné zobrazení data.frame

Vpravo nahoře v okénku Environment ťukněte na název data.frame (v našem případě data), tím se automaticky vyvolá příkaz View(data) a otevře se záložka s velice pěkným náhledem data.frame.

Pozor! Pokud však provedete v data.frame nějaké úpravy, zobrazení tabulky se samo neaktualizuje. Je nutné znovu klepnout na název data.frame v okénku Environment.

Odkaz na jednotlivé sloupce

data$count    # odkaz na sloupec (vektor) dle názvu
##  [1] 10  7 20 14 14 12 10 23 17 20 14 13 11 17 21 11 16 14 17 17 19 21  7
## [24] 13  0  1  7  2  3  1  2  1  3  0  1  4  3  5 12  6  4  3  5  5  5  5
## [47]  2  4  3  5  3  5  3  6  1  1  3  2  6  4 11  9 15 22 15 16 13 10 26
## [70] 26 24 13
data$spray    # napovídání: stačí napsat data$ a automaticky vyskakuje seznam sloupců
##  [1] A A A A A A A A A A A A B B B B B B B B B B B B C C C C C C C C C C C
## [36] C D D D D D D D D D D D D E E E E E E E E E E E E F F F F F F F F F F
## [71] F F
## Levels: A B C D E F
mean(data$count)   # výpočty se sloupcem
## [1] 9.5
# Odkaz na sloupec podle indexu: všechny řádky, 1. sloupec.
# Pokud to však jde, bylo by přehlednější odkazovat názvem (tedy data$count).
data[, 1]
##  [1] 10  7 20 14 14 12 10 23 17 20 14 13 11 17 21 11 16 14 17 17 19 21  7
## [24] 13  0  1  7  2  3  1  2  1  3  0  1  4  3  5 12  6  4  3  5  5  5  5
## [47]  2  4  3  5  3  5  3  6  1  1  3  2  6  4 11  9 15 22 15 16 13 10 26
## [70] 26 24 13
data[, 2]     # všechny řádky, 2. sloupec
##  [1] A A A A A A A A A A A A B B B B B B B B B B B B C C C C C C C C C C C
## [36] C D D D D D D D D D D D D E E E E E E E E E E E E F F F F F F F F F F
## [71] F F
## Levels: A B C D E F
data[1:5, ]   # výřez - prvních pět řádků, všechny sloupce
##   count spray
## 1    10     A
## 2     7     A
## 3    20     A
## 4    14     A
## 5    14     A
data[1:5, 1]  # prvních pět řádků, 1. sloupec
## [1] 10  7 20 14 14
data$count[1:5] # totéž, ale přehledněji: prvních 5 hodnot sloupce count
## [1] 10  7 20 14 14
# histogram celého sloupce count
hist(data$count)

Výběr části data.frame na základě podmínky (subsetting)

# histogram hodnot count jen pro část dat, kde spray je A
vyber <- subset(data, spray == "A")
hist(vyber$count)

Krabicové grafy

# krabicový graf count rozdělený na skupiny dle faktoru spray
boxplot(count ~ spray, data = data)

# a hezké popisky
boxplot(count ~ spray, data = data, xlab = "Typ postřiku", ylab = "Počet hmyzu",
        main = "Srovnání postřiků", col = "lightblue")

Poznámka: seznam předdefinovaných názvů barev obdržíme funkcí colors().

Krabicové grafy podle kategorií více proměnných

Funkce pro krabicové grafy umí rozdělit skupiny i podle kombinace hodnot kategorií více proměnných.

Např. data.frame ToothGrowth porovnává velikost zubů pokusných zvířat (sloupec len) v několika skupinách. Třem skupinám byl podáván vitamin C v kyselině askorbové (VC ve sloupci supp) v dávkách 0.5, 1.0 a 2.0 mg (sloupec dose), zatímco jiným třem skupinám byl podáván vitamin C v pomerančovém džusu (OJ ve sloupci supp), opět v různých dávkách.

Porovnání rozdělení délky zubů (len) podle skupin vytvořených kombinacemi hodnot obou proměnných (supp, dose) v data.frame ToothGrowth můžeme učinit jednoduše pomocí následujícího zápisu funkce boxplot().

boxplot(len ~ supp*dose, ToothGrowth)

Vytvoření vlastního data.frame

Data.frame si můžeme sami vytvořit přímo v R slepením jednotlivých vektorů.

mojeData <- data.frame(cisloID = 1:5, druhySloupec = c("muž", "žena", "muž", "muž", "žena"))
print(mojeData)
##   cisloID druhySloupec
## 1       1          muž
## 2       2         žena
## 3       3          muž
## 4       4          muž
## 5       5         žena

Uložení data.frame do souboru

Jednoduchý textový formát.

write.table(mojeData, "souborVystup.txt", sep = " ", row.names = FALSE)  # jako oddělovač volím mezeru

Excel – co si budeme povídat, pro většinu lidí je to pořád ten nejdostupnější formát.

library(openxlsx)  # pokud není knihovna nainstalována, tak nejdříve zavolat: install.packages("openxlsx")
write.xlsx(mojeData, "souborVystup.xlsx", sheetName = "První záložka", row.names = FALSE)

Úlohy

  1. Použijte interní data.frame airquality, uložte jej do proměnné data.
  2. Podívejte se různými způsoby na náhled této proměnné.
  3. Uložte ji do souboru (buď .txt nebo .xlsx podle vlastního zvážení).
  4. Vypočtěte celkovou průměrnou hodnotu Ozone.
  5. Vypočtěte průměr Ozone jen pro Month == 5 (nápověda: použijte funkci subset(), viz výše)
  6. Zobrazte histogram všech hodnot Wind.
  7. Zobrazte krabicové grafy rozdělení Temp v jednotlivých skupinách dle Month.
  8. Zobrazte počet položek pro každý měsíc (nápověda: použijte funkci table() na sloupec Month).
  9. Zobrazte korelační grafy mezi všemi páry proměnných (nápověda: je to příkaz pairs(data)).

© 6. 3. 2015 Tomáš Bořil, borilt@gmail.com