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 addressere en søjle med dens navn. 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=mydataSoejle1
I kodedelen nedenfor indlæses data fra en fil Ind.csv med indholdet
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