Afsnit R.3: Indlæsning, dataframe og matriks
Jeg vil beskrive to forskellige indlæsningssituationer. I den
første situation skal vi blot indlæse en række tal uden nogen speciel struktur.
Typisk vil tallene være adskildt af mellemrum (et eller flere) og eventuelt
være skrevet på flere linjer. I denne situation bruger man
R-kommandoen
scan:
scan("filnavn")
hvilket giver en vektor med tallene.
I den anden datasituation er data organiseret i søjler, typisk med
søjleoverskrifter, og data i en række er adskildt af kommaer (typisk
vil datafilen have endelsen "csv"). Data indlæses med kommandoen
read.csv, og hvis vi ønsker det indlæste placeret i
en struktur med navnet
mydata, bliver kaldet
mydata=read.csv("filnavn",header=TRUE,stringsAsFactors=TRUE)
Hvis der ikke er søjleoverskrifter i datafilen skal "header=TRUE"
erstattes af "header=FALSE". Det indlæste,
mydata, er en
dataframe,
hvilket man kan tænke på som en liste af søjler (variable),
alle med samme længde. Man kan få værdierne i en søjle ved brug af
søjlenavnet.
Hvis for eksempel der er en søjle med navnet
Soejle1 får man
indholdet placeret i en vektor med navnet
mysoejle1
med kommandoen
mysoejle1=mydata$Soejle1
Man kan også tilføje nye søjler til en eksisterende dataframe. For eksempel
kan man tilføje søjlen
logSoejle1, med logaritmen til værdierne
i søjlen med navnet
Soejle1, med kommandoen
mydata$logSoejle1=log(mydata
$Soejle1)
I kodedelen nedenfor indlæses data fra en fil
Ind.csv med indholdet
Koen,AlderPige,7Pige,2Dreng,5Dreng,7Dreng,3
Når denne indlæses og udskrives vil
R indsætte et rækkenummer
ud for hver række.
> mdat=read.csv("Ind.csv",header=TRUE,stringsAsFactors=TRUE)
> mdat
Koen Alder
1 Pige 7
2 Pige 2
3 Dreng 5
4 Dreng 7
5 Dreng 3
> class(mdat) # angiver datastrukturen
[1] "data.frame"
> mdat$Alder[1]
[1] 7
> mdat[1,2]
[1] 7
I den sidste kommando ovenfor udtrækkes et element ved brug af
rækkenummer og søjlenummer.
R.3.1 Matricer
Ligesom data kan organiseres i vektorer i
R, kan
data også organiseres i
matricer, det vil sige en struktur med et antal rækker og et antal søjler.
En matrix kan dannes med en af
kommandoerne
matrix() eller rbind() eller
cbind()
Den første tager som input en vektor med alle tallene i matricen og to
tal, der angiver antal rækker og antal søjler. Som default bliver
tallene indsat søjlevis, medmindre man tilføjer
byrow=TRUE.
De to andre metoder
rbind og
cbind tager et antal vektorer
som input, og opfatter disse som henholdsvis rækkerne i matricen eller
som søjlerne i matricen.
> aMat=matrix(c(1,2,3,4,5,6,7,8,9,10,11,12),3,4,byrow=T)
> aMat
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
> rbind(c(1,2,3,4),c(5,6,7,8),c(9,10,11,12))
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
> cbind(c(1,5,9),c(2,6,10),c(3,7,11),c(4,8,12))
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
> t(aMat) # aMat transponeret
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> aMat[2,3] # indgang (2,3)
[1] 7
> aMat[2,] # række 2 som en vektor
[1] 5 6 7 8
> aMat[,2] # søjle 2 som en vektor
[1] 2 6 10
> c(aMat) # alle indgangene læst søjlevis
[1] 1 5 9 2 6 10 3 7 11 4 8 12
> max(aMat) # maximum over alle indgange
[1] 12
> mean(aMat) # gennemsnit inden for hver søjle
[1] 6.5
> rowSums(aMat) # sum af indgangene i hver række
[1] 10 26 42
> rowMeans(aMat) # gennemsnit af indgangene i hver række
[1] 2.5 6.5 10.5
> apply(aMat,1,max) # maximum af indgangene i hver række
[1] 4 8 12
Matrix multiplikation betegnes med
%*%, og den
inverse af en kvadratisk matrix fås med
solve.
> aMat=rbind(c(1,2),c(3,4))
> bMat=rbind(c(1,2,3),c(4,5,6))
> aMat%*%bMat
[,1] [,2] [,3]
[1,] 9 12 15
[2,] 19 26 33
> solve(aMat)
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5
> aMat%*%solve(aMat)
[,1] [,2]
[1,] 1 1.110223e-16
[2,] 0 1.000000e+00
> v=c(1,2) # dette er en vektor
> v%*%aMat # R opfatter v som en rækkevektor
[,1] [,2]
[1,] 7 10
> aMat%*%v # R opfatter også v som en søjlevektor
[,1]
[1,] 5
[2,] 11
> v=rbind(c(1,2)) # nu laver vi v til en matrix med 1 række
> v
[,1] [,2]
[1,] 1 2
> aMat%*%v
Error in A %*% v : non-conformable arguments
ForegåendeNæste