Funkcie pre načítavanie dátových súborov

Základné funkcie na načítanie dát z externého .txt súboru sú scan() (načíta vektor) a read.table() (načíta dátový rámec).

r<-scan(): skopíruje stĺpec z excelu do premennej r. Kopírovanie dát po stĺpcoch obvykle ale nie je príliš praktické. Používame preto príkazy na načítavanie kompletných súborov.

Funkcia read.table() má veľa parametrov, ktoré môžu uľahčiť načítavanie dát bez potreby ich upravovania:

-header - identifikátor toho, či dáta obsahujú hlavičku s názvami stĺpcov alebo nie.

-sep - identifikácia symbolu použitého na oddelenie jednotlivých hodnôt v súbore (medzera, čiarka…).

-dec - identifikácia symbolu použitého ako desatinná čiarka (.,).

-row.names, col.names - identifikácia toho, či a kde sú v súbore názvy riadkov/stĺpcov, prípadne ich priame definovanie.

-na.strings - identifikácia symbolu použitého ako chýbajúca hodnota (NA, …).

-nrows - počet riadkov, ktoré majú byť načítané (vhodné pri veľmi rozsiahlych dátových súboroch, kde je postačujúca určitá vzorka).

-skip - počet riadkov od začiatku súboru, ktoré majú byť preskočené pri načítavaní dát.

-comment.char - identifikácia symbolu použitého ako komentár.

Na import dát z csv súboru slúžia funkcie read.csv(), resp. read.csv2().

Príklad: Dĺžka chodidla detí

Načítame súbor o dĺžke chodidiel pomocou príkazu read.csv do premennej feet

feet <- read.csv("http://www.iam.fmph.uniba.sk/ospm/Filova/rm/anthropometry.csv", sep=",", header=TRUE, encoding="UTF-8")

Jednoduchší spôsob, v prípade, ak používate RStudio, je cez File -> Import Dataset

Preskúmame štruktúru dátového súboru.

head(feet)
##        age gender foot_length height
## 1 4.166667 female         163  103.3
## 2 4.250000   male         163  103.9
## 3 4.416667 female         171  111.2
## 4 3.833333 female         163   99.7
## 5 3.416667 female         167   99.7
## 6 3.666667   male         164   98.7
head(feet, n=10)
##         age gender foot_length height
## 1  4.166667 female         163  103.3
## 2  4.250000   male         163  103.9
## 3  4.416667 female         171  111.2
## 4  3.833333 female         163   99.7
## 5  3.416667 female         167   99.7
## 6  3.666667   male         164   98.7
## 7  3.333333   male         150   94.1
## 8  3.583333 female         150   93.3
## 9  5.500000 female         175  116.4
## 10 5.166667 female         172  110.0
dim(feet)
## [1] 3898    4
summary(feet)
##       age           gender           foot_length        height     
##  Min.   : 2.00   Length:3898        Min.   :116.0   Min.   : 81.3  
##  1st Qu.: 6.50   Class :character   1st Qu.:185.0   1st Qu.:118.2  
##  Median :10.67   Mode  :character   Median :220.0   Median :140.7  
##  Mean   :10.39                      Mean   :214.3   Mean   :138.5  
##  3rd Qu.:14.00                      3rd Qu.:240.0   3rd Qu.:158.7  
##  Max.   :20.00                      Max.   :311.0   Max.   :194.4  
##                                     NA's   :62      NA's   :6

Jednotlivé premenné v dátovom súbore voláme cez $

feet$age
mean(feet$age)

Skonvertujeme premennú gender na faktorovú premennú:

feet$gender <- as.factor(feet$gender)
summary(feet)
##       age           gender      foot_length        height     
##  Min.   : 2.00   female:1922   Min.   :116.0   Min.   : 81.3  
##  1st Qu.: 6.50   male  :1976   1st Qu.:185.0   1st Qu.:118.2  
##  Median :10.67                 Median :220.0   Median :140.7  
##  Mean   :10.39                 Mean   :214.3   Mean   :138.5  
##  3rd Qu.:14.00                 3rd Qu.:240.0   3rd Qu.:158.7  
##  Max.   :20.00                 Max.   :311.0   Max.   :194.4  
##                                NA's   :62      NA's   :6

Transformácia premenných

feet2 <- transform(feet, foot_cm=foot_length/10, agernd=round(age,1))
head(feet2)
##        age gender foot_length height foot_cm agernd
## 1 4.166667 female         163  103.3    16.3    4.2
## 2 4.250000   male         163  103.9    16.3    4.2
## 3 4.416667 female         171  111.2    17.1    4.4
## 4 3.833333 female         163   99.7    16.3    3.8
## 5 3.416667 female         167   99.7    16.7    3.4
## 6 3.666667   male         164   98.7    16.4    3.7

Podmnožina dátového súboru

#feet[3, ]
#feet[3:5, ]
#feet[-c(2,4), ]

subset(feet, foot_length>=300)
##           age gender foot_length height
## 119  18.58333   male         305  186.6
## 903  17.83333   male         308  181.4
## 1300 18.66667   male         311  186.4
## 1552 17.66667   male         303  185.3
## 1575 17.83333   male         300  193.1
## 2033 17.08333   male         300  189.6
## 3297 18.16667   male         301  194.4
#subset(feet, gender=="female")
subset(feet, foot_length>=300, select=c(age, gender))
##           age gender
## 119  18.58333   male
## 903  17.83333   male
## 1300 18.66667   male
## 1552 17.66667   male
## 1575 17.83333   male
## 2033 17.08333   male
## 3297 18.16667   male

Úloha: Vypíšte tie riadky súboru feet, ktoré označujú pozorovania dospelých ľudí.

Odstránenie chýbajúcich pozorovaní

feet3 <- feet[complete.cases(feet), ]

alebo ak vieme, že chýbajúce pozorovania sú len v jednom stĺpci

feet3 <- feet[!is.na(feet$foot_length), ]

Funkcia ‘attach’ a základné štatistické funkcie

attach(feet3)
#gender
c(mean(foot_length), mean(height))
## [1] 214.2984 138.7623
c(median(foot_length), median(height))
## [1] 220.0 141.3
sd(height)
## [1] 24.76607
detach(feet3)

Pridávanie nových premenných do súboru

weight <- rnorm(dim(feet3)[1], 30, 15)
feet3$weight <- weight
head(feet3)
##        age gender foot_length height   weight
## 1 4.166667 female         163  103.3 19.85235
## 2 4.250000   male         163  103.9 41.51598
## 3 4.416667 female         171  111.2 26.65376
## 4 3.833333 female         163   99.7 25.39230
## 5 3.416667 female         167   99.7 17.71882
## 6 3.666667   male         164   98.7 47.43102

Úloha: Vytvorte novú premennú bmi a uložte do nej body mass index detí.

Základné grafické príkazy

plot(feet3)

hist(feet3$foot_length)

Histogram

Takýto základný histogram vieme vylepšiť napríklad takto:

par(mar = c(2, 2, 2, 2))
hist(feet$foot_length, breaks=20, col=rainbow(100), main="Dlzka chodidla", labels=TRUE)

Boxplot

boxplot(feet$foot_length)

boxplot(feet$foot_length ~ feet$gender, col=c("blue", "red"), ylim=c(100,350))

Scatterplot

plot(feet$height, feet$foot_length)

plot(feet$height, feet$foot_length, col=feet$gender)

plot(feet$height, feet$foot_length, col=c("blue", "red")[feet$gender])

Pre viac grafov vedľa seba/pod sebou zadefinujeme “maticu grafickych okien”:

par(mfrow=c(2,2))
hist(feet$foot_length, breaks=20, col=rainbow(100), main="Dlzka chodidla", labels=TRUE)
hist(feet$height, breaks=20, col=rainbow(100), main="Vyska", labels=TRUE)
boxplot(feet$foot_length ~ feet$gender, col=heat.colors(8, alpha=1), ylim=c(100,350))
boxplot(feet$height ~ feet$gender, col=heat.colors(8, alpha=1), ylim=c(50,200))

Export dát

Export dátového súboru write.table(feet, file="feet.xlsx", sep="\t")

Import dát iných formátov

Importovať dáta z formátov určených pre iný štatistický software môžeme pomocou knižnice ‘haven’:

library(haven)
data_stata <- read_dta("data.dta")
data_spss <- read_sav("data.sav")
data_sas <- read_sas("data.sas7bdat")

Konverzia medzi dlhým a širokým formátom dát

Najmä v situáciách, keď pre jeden subjekt pozorujeme priebeh opakovaných meraní, sa dáta zaznamenávajú v rôznych formátoch a rôzne štatistické funkcie vyžadujú rôzne formáty.

Jednou možnosťou je zaznamenávať pozorovania pre každý subkejt do jedného riadku a opakované merania do rôznych stĺpcov. Druhou je mať zvlášť riadok pre každé pozorovanie a porozovania pre rovnaký subjekt identifikovať pomocou dodatočnej premennej.

Načítame dáta popisujúce zmenu krvného tlaku pacientov v piatich časoch (DBP1-DBP5) po podaní dvoch rôznych liekov (A, B). U pacientov sme ďalej zaznamenali vek a pohlavie. Tieto dáta sú v tzv. širokom formáte.

DBP <- read.table("http://www.iam.fmph.uniba.sk/ospm/Filova/clin/DBP.csv", header=TRUE, sep=",")
head(DBP)
##   Subject TRT DBP1 DBP2 DBP3 DBP4 DBP5 Age Sex
## 1       1   A  114  115  113  109  105  43   F
## 2       2   A  116  113  112  103  101  51   M
## 3       3   A  119  115  113  104   98  48   F
## 4       4   A  115  113  112  109  101  42   F
## 5       5   A  116  112  107  104  105  49   M
## 6       6   A  117  112  113  104  102  47   M
dim(DBP)
## [1] 40  9
summary(DBP)
##     Subject          TRT                 DBP1            DBP2      
##  Min.   : 1.00   Length:40          Min.   :114.0   Min.   :111.0  
##  1st Qu.:10.75   Class :character   1st Qu.:115.0   1st Qu.:113.0  
##  Median :20.50   Mode  :character   Median :116.5   Median :115.0  
##  Mean   :20.50                      Mean   :116.7   Mean   :114.3  
##  3rd Qu.:30.25                      3rd Qu.:118.0   3rd Qu.:115.0  
##  Max.   :40.00                      Max.   :121.0   Max.   :119.0  
##       DBP3            DBP4            DBP5            Age       
##  Min.   :100.0   Min.   :102.0   Min.   : 97.0   Min.   :38.00  
##  1st Qu.:112.0   1st Qu.:106.8   1st Qu.:101.8   1st Qu.:42.00  
##  Median :113.0   Median :109.0   Median :106.5   Median :48.00  
##  Mean   :112.4   Mean   :109.3   Mean   :106.7   Mean   :47.83  
##  3rd Qu.:113.0   3rd Qu.:113.2   3rd Qu.:112.0   3rd Qu.:51.25  
##  Max.   :118.0   Max.   :117.0   Max.   :115.0   Max.   :63.00  
##      Sex           
##  Length:40         
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

Na zmenu formátu použijeme príkaz reshape:

DBP_long <- reshape(DBP, direction="long", varying = c("DBP1","DBP2","DBP3","DBP4","DBP5"),
 idvar = c("Subject","TRT","Age","Sex"),sep="")
colnames(DBP_long) <- c("Subject","TRT","Age","Sex","Time","DBP")
head(DBP_long)
##            Subject TRT Age Sex Time DBP
## 1.A.43.F.1       1   A  43   F    1 114
## 2.A.51.M.1       2   A  51   M    1 116
## 3.A.48.F.1       3   A  48   F    1 119
## 4.A.42.F.1       4   A  42   F    1 115
## 5.A.49.M.1       5   A  49   M    1 116
## 6.A.47.M.1       6   A  47   M    1 117
dim(DBP_long)
## [1] 200   6
summary(DBP_long)
##     Subject          TRT                 Age            Sex           
##  Min.   : 1.00   Length:200         Min.   :38.00   Length:200        
##  1st Qu.:10.75   Class :character   1st Qu.:42.00   Class :character  
##  Median :20.50   Mode  :character   Median :48.00   Mode  :character  
##  Mean   :20.50                      Mean   :47.83                     
##  3rd Qu.:30.25                      3rd Qu.:51.25                     
##  Max.   :40.00                      Max.   :63.00                     
##       Time        DBP       
##  Min.   :1   Min.   : 97.0  
##  1st Qu.:2   1st Qu.:109.0  
##  Median :3   Median :113.0  
##  Mean   :3   Mean   :111.9  
##  3rd Qu.:4   3rd Qu.:115.0  
##  Max.   :5   Max.   :121.0

Tento formát môžeme využiť napríklad na vykreslenie priebehu krvného tlaku pre jednotlivých pacientov pomocou balíka lattice:

library(lattice)
xyplot(DBP ~ Time|as.factor(Subject), type="l", groups=TRT,
   strip=strip.custom(bg="white"), lty=c(1,8), lwd=2, layout=c(10,4), DBP_long)

Príklady na precvičenie

  1. Preskúmajte štruktúru dát DBP podobne ako pri dátach z cvičení.

  2. Vytvorte premennú diff, v ktorej bude rozdiel krvného tlaku v poslednom čase (DBP5) a v prvom čase (DBP1). Ktorý liek spôsobil väčšiu priemernú zmenu tlaku? Je rozdiel väčší pre mužov alebo pre ženy?

  3. Vykreslite histogramy a boxploty pre zmenu krvného tlaku v závislosti od pohlavia a od ošetrenia.