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()
.
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
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
#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í.
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), ]
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)
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í.
plot(feet3)
hist(feet3$foot_length)
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(feet$foot_length)
boxplot(feet$foot_length ~ feet$gender, col=c("blue", "red"), ylim=c(100,350))
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átového súboru write.table(feet, file="feet.xlsx", sep="\t")
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")
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)
Preskúmajte štruktúru dát DBP podobne ako pri dátach z cvičení.
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?
Vykreslite histogramy a boxploty pre zmenu krvného tlaku v závislosti od pohlavia a od ošetrenia.