A Report Generated by knitr

This report is automatically generated with the R package knitr (version `1.5`) .

    # Chapter 7 Working in More Dimensions Adding a Second Dimension Discovering a new
    # dimension Creating your first matrix
    first.matrix <- matrix(1:12, ncol = 4)
    first.matrix

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    4    7   10
    ## [2,]    2    5    8   11
    ## [3,]    3    6    9   12

    matrix(1:12, ncol = 4, byrow = TRUE)

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    2    3    4
    ## [2,]    5    6    7    8
    ## [3,]    9   10   11   12

    ### Looking at the properties
    str(first.matrix)

    ##  int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...

    dim(first.matrix)

    ## [1] 3 4

    length(first.matrix)

    ## [1] 12

    attributes(my.array)

    ## Error: object 'my.array' not found

    attr(baskets.team, "season") <- "2010-2011"

    ## Error: object 'baskets.team' not found

    attr(baskets.team, "season")

    ## Error: object 'baskets.team' not found

    attr(baskets.team, "season") <- NULL

    ## Error: object 'baskets.team' not found

    ## Combining vectors into a matrix
    baskets.of.Granny <- c(12, 4, 5, 6, 9, 3)
    baskets.of.Geraldine <- c(5, 4, 2, 4, 12, 9)
    baskets.team <- rbind(baskets.of.Granny, baskets.of.Geraldine)
    baskets.team

    ##                      [,1] [,2] [,3] [,4] [,5] [,6]
    ## baskets.of.Granny      12    4    5    6    9    3
    ## baskets.of.Geraldine    5    4    2    4   12    9

    cbind(1:3, 4:6, matrix(7:12, ncol = 2))

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    4    7   10
    ## [2,]    2    5    8   11
    ## [3,]    3    6    9   12

    # Using the Indices Extracting values from a matrix Using numeric indices
    first.matrix[1:2, 2:3]

    ##      [,1] [,2]
    ## [1,]    4    7
    ## [2,]    5    8

    first.matrix[2:3, ]

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    2    5    8   11
    ## [2,]    3    6    9   12

    ### Dropping values using negative indices
    first.matrix[-2, -3]

    ##      [,1] [,2] [,3]
    ## [1,]    1    4   10
    ## [2,]    3    6   12

    nr <- nrow(first.matrix)
    id <- nr * 2 + 2
    first.matrix[-id]

    ##  [1]  1  2  3  4  5  6  7  9 10 11 12

    first.matrix[-(2 * nrow(first.matrix) + 2)]

    ##  [1]  1  2  3  4  5  6  7  9 10 11 12

    ### Juggling dimensions
    first.matrix[-c(1, 3), ]

    ## [1]  2  5  8 11

    first.matrix[2, , drop = FALSE]

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    2    5    8   11

    ## Replacing values in a matrix
    first.matrix[3, 2] <- 4
    first.matrix

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    4    7   10
    ## [2,]    2    5    8   11
    ## [3,]    3    4    9   12

    first.matrix[2, ] <- c(1, 3)
    first.matrix

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    4    7   10
    ## [2,]    1    3    1    3
    ## [3,]    3    4    9   12

    first.matrix[1:2, 3:4] <- c(8, 4, 2, 1)
    first.matrix

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    4    8    2
    ## [2,]    1    3    4    1
    ## [3,]    3    4    9   12

    # Naming Matrix Rows and Columns Changing the row and column names
    rownames(baskets.team) <- c("Granny", "Geraldine")
    rownames(baskets.team)

    ## [1] "Granny"    "Geraldine"

    colnames(baskets.team) <- c("1st", "2nd", "3th", "4th", "5th", "6th")
    baskets.team

    ##           1st 2nd 3th 4th 5th 6th
    ## Granny     12   4   5   6   9   3
    ## Geraldine   5   4   2   4  12   9

    colnames(baskets.team)[3] <- "3rd"
    baskets.copy <- baskets.team
    colnames(baskets.copy) <- NULL
    baskets.copy

    ##           [,1] [,2] [,3] [,4] [,5] [,6]
    ## Granny      12    4    5    6    9    3
    ## Geraldine    5    4    2    4   12    9

    ## Using names as indices
    baskets.team[, c("2nd", "5th")]

    ##           2nd 5th
    ## Granny      4   9
    ## Geraldine   4  12

    baskets.team["Granny", ]

    ## 1st 2nd 3rd 4th 5th 6th
    ##  12   4   5   6   9   3

    # Calculating with Matrices Using standard operations with matrices
    first.matrix + 4

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    5    8   12    6
    ## [2,]    5    7    8    5
    ## [3,]    7    8   13   16

    second.matrix <- matrix(1:3, nrow = 3, ncol = 4)
    first.matrix + second.matrix

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    2    5    9    3
    ## [2,]    3    5    6    3
    ## [3,]    6    7   12   15

    # first.matrix + second.matrix[,1:3] # gives error for illustration Error in first.matrix +
    # second.matrix[, 1:3] : non-conformable arrays
    first.matrix + 1:3

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    2    5    9    3
    ## [2,]    3    5    6    3
    ## [3,]    6    7   12   15

    ## Calculating row and column summaries
    rowSums(baskets.team)

    ##    Granny Geraldine
    ##        39        36

    ## Doing matrix arithmetic Transposing a matrix
    t(first.matrix)

    ##      [,1] [,2] [,3]
    ## [1,]    1    1    3
    ## [2,]    4    3    4
    ## [3,]    8    4    9
    ## [4,]    2    1   12

    t(1:10)

    ##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    ## [1,]    1    2    3    4    5    6    7    8    9    10

    t(first.matrix[2, ])

    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    3    4    1

    ### Inverting a matrix
    square.matrix <- matrix(c(1, 0, 3, 2, 2, 4, 3, 2, 1), ncol = 3)
    solve(square.matrix)

    ##      [,1]    [,2]    [,3]
    ## [1,]  0.5 -0.8333  0.1667
    ## [2,] -0.5  0.6667  0.1667
    ## [3,]  0.5 -0.1667 -0.1667

    ### Multiplying two matrices
    first.matrix %*% t(second.matrix)

    ##      [,1] [,2] [,3]
    ## [1,]   15   30   45
    ## [2,]    9   18   27
    ## [3,]   28   56   84

    first.matrix %*% 1:4

    ##      [,1]
    ## [1,]   41
    ## [2,]   23
    ## [3,]   86

    1:3 %*% first.matrix

    ##      [,1] [,2] [,3] [,4]
    ## [1,]   12   22   43   40

    # Adding More Dimensions Creating an array Using the creator functions
    my.array <- array(1:24, dim = c(3, 4, 2))
    my.array

    ## , , 1
    ##
    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    4    7   10
    ## [2,]    2    5    8   11
    ## [3,]    3    6    9   12
    ##
    ## , , 2
    ##
    ##      [,1] [,2] [,3] [,4]
    ## [1,]   13   16   19   22
    ## [2,]   14   17   20   23
    ## [3,]   15   18   21   24

    ### Changing the dimensions of a vector
    my.vector <- 1:24
    dim(my.vector) <- c(3, 4, 2)
    identical(my.array, my.vector)

    ## [1] TRUE

    ## Using dimensions to extract values
    my.array[2, 3, 1]

    ## [1] 8

    my.array[, 3, 2, drop = FALSE]

    ## , , 1
    ##
    ##      [,1]
    ## [1,]   19
    ## [2,]   20
    ## [3,]   21

    my.array[2, , ]

    ##      [,1] [,2]
    ## [1,]    2   14
    ## [2,]    5   17
    ## [3,]    8   20
    ## [4,]   11   23

    # Combining Different Types of Values in a Data Frame Creating a data frame from a matrix
    # Using the function as.data.frame
    baskets.df <- as.data.frame(t(baskets.team))
    ### Looking at the structure of a data frame
    baskets.df

    ##     Granny Geraldine
    ## 1st     12         5
    ## 2nd      4         4
    ## 3rd      5         2
    ## 4th      6         4
    ## 5th      9        12
    ## 6th      3         9

    str(baskets.df)

    ## 'data.frame':	6 obs. of  2 variables:
    ##  $ Granny   : num  12 4 5 6 9 3
    ##  $ Geraldine: num  5 4 2 4 12 9

    ### Counting values and variables
    nrow(baskets.df)

    ## [1] 6

    length(baskets.df)

    ## [1] 2

    ## Creating a data frame from scratch Making a data frame from vectors
    employee <- c("John Doe", "Peter Gynn", "Jolie Hope")
    salary <- c(21000, 23400, 26800)
    startdate <- as.Date(c("2010-11-1", "2008-3-25", "2007-3-14"))
    employ.data <- data.frame(employee, salary, startdate)
    str(employ.data)

    ## 'data.frame':	3 obs. of  3 variables:
    ##  $ employee : Factor w/ 3 levels "John Doe","Jolie Hope",..: 1 3 2
    ##  $ salary   : num  21000 23400 26800
    ##  $ startdate: Date, format: "2010-11-01" "2008-03-25" ...

    ### Keeping characters as characters
    employ.data <- data.frame(employee, salary, startdate, stringsAsFactors = FALSE)
    str(employ.data)

    ## 'data.frame':	3 obs. of  3 variables:
    ##  $ employee : chr  "John Doe" "Peter Gynn" "Jolie Hope"
    ##  $ salary   : num  21000 23400 26800
    ##  $ startdate: Date, format: "2010-11-01" "2008-03-25" ...

    ## Naming variables and observations Working with variable names
    colnames(employ.data)

    ## [1] "employee"  "salary"    "startdate"

    names(employ.data)

    ## [1] "employee"  "salary"    "startdate"

    names(employ.data)[3] <- "firstday"
    names(employ.data)

    ## [1] "employee" "salary"   "firstday"

    ### Naming observations
    rownames(employ.data)

    ## [1] "1" "2" "3"

    rownames(employ.data) <- c("Chef", "BigChef", "BiggerChef")
    employ.data

    ##              employee salary   firstday
    ## Chef         John Doe  21000 2010-11-01
    ## BigChef    Peter Gynn  23400 2008-03-25
    ## BiggerChef Jolie Hope  26800 2007-03-14

    # Manipulating Values in a Data Frame Extracting variables, observations, and values
    # Pretending it's a matrix
    baskets.df["3rd", "Geraldine"]

    ## [1] 2

    baskets.df[, 1]

    ## [1] 12  4  5  6  9  3

    str(baskets.df[, 1, drop = FALSE])

    ## 'data.frame':	6 obs. of  1 variable:
    ##  $ Granny: num  12 4 5 6 9 3

    ### Putting your dollar where your data is
    baskets.df$Granny

    ## [1] 12  4  5  6  9  3

    ## Adding observations to a data frame Adding a single observation
    result <- rbind(baskets.df, c(7, 4))
    result

    ##     Granny Geraldine
    ## 1st     12         5
    ## 2nd      4         4
    ## 3rd      5         2
    ## 4th      6         4
    ## 5th      9        12
    ## 6th      3         9
    ## 7        7         4

    baskets.df <- rbind(baskets.df, `7th` = c(7, 4))
    baskets.df

    ##     Granny Geraldine
    ## 1st     12         5
    ## 2nd      4         4
    ## 3rd      5         2
    ## 4th      6         4
    ## 5th      9        12
    ## 6th      3         9
    ## 7th      7         4

    ### Adding a series of new observations using rbind
    new.baskets <- data.frame(Granny = c(3, 8), Geraldine = c(9, 4))
    rownames(new.baskets) <- c("8th", "9th")
    baskets.df <- rbind(baskets.df, new.baskets)
    ### Adding a series of values using indices
    baskets.df[c("8th", "9th"), ] <- matrix(c(3, 8, 9, 4), ncol = 2)
    baskets.df[c("8th", "9th"), ] <- c(3, 8, 9, 4)
    ## Adding variables to a data frame Adding a single variable
    baskets.of.Gabrielle <- c(11, 5, 6, 7, 3, 12, 4, 5, 9)
    baskets.df$Gabrielle <- baskets.of.Gabrielle
    head(baskets.df, 4)

    ##     Granny Geraldine Gabrielle
    ## 1st     12         5        11
    ## 2nd      4         4         5
    ## 3rd      5         2         6
    ## 4th      6         4         7

    ### Adding multiple variables using cbind
    new.df <- data.frame(Gertrude = c(3, 5, 2, 1, NA, 3, 1, 1, 4), Guinevere = c(6, 9, 7, 3, 3,
        6, 2, 10, 6))
    head(cbind(baskets.df, new.df), 4)

    ##     Granny Geraldine Gabrielle Gertrude Guinevere
    ## 1st     12         5        11        3         6
    ## 2nd      4         4         5        5         9
    ## 3rd      5         2         6        2         7
    ## 4th      6         4         7        1         3

    # Combining Different Objects in a List Creating a list Creating an unnamed list
    baskets.list <- list(baskets.team, "2010-2011")
    baskets.list

    ## [[1]]
    ##           1st 2nd 3rd 4th 5th 6th
    ## Granny     12   4   5   6   9   3
    ## Geraldine   5   4   2   4  12   9
    ##
    ## [[2]]
    ## [1] "2010-2011"

    ### Creating a named list
    baskets.nlist <- list(scores = baskets.team, season = "2010-2011")
    baskets.nlist

    ## $scores
    ##           1st 2nd 3rd 4th 5th 6th
    ## Granny     12   4   5   6   9   3
    ## Geraldine   5   4   2   4  12   9
    ##
    ## $season
    ## [1] "2010-2011"

    ### Playing with the names of elements
    names(baskets.nlist)

    ## [1] "scores" "season"

    ### Getting the number of elements
    length(baskets.list)

    ## [1] 2

    ## Extracting elements from lists Using [[]]
    baskets.list[[1]]

    ##           1st 2nd 3rd 4th 5th 6th
    ## Granny     12   4   5   6   9   3
    ## Geraldine   5   4   2   4  12   9

    baskets.nlist[["scores"]]

    ##           1st 2nd 3rd 4th 5th 6th
    ## Granny     12   4   5   6   9   3
    ## Geraldine   5   4   2   4  12   9

    ### Using []
    baskets.list[-1]

    ## [[1]]
    ## [1] "2010-2011"

    baskets.nlist[names(baskets.nlist) == "season"]

    ## $season
    ## [1] "2010-2011"

    ## Changing the elements in lists Changing the value of elements
    baskets.nlist[[1]] <- baskets.df
    baskets.nlist[["scores"]] <- baskets.df
    baskets.nlist$scores <- baskets.df
    baskets.nlist[1] <- list(baskets.df)
    baskets.list[1:2] <- list(baskets.df, "2009-2010")
    ### Removing elements
    baskets.nlist[[1]] <- NULL
    baskets.nlist$scores <- NULL
    baskets.nlist["scores"] <- NULL
    baskets.nlist <- list(scores = baskets.df, season = "2010-2011")
    baskets.nlist["scores"] <- list(NULL)
    baskets.nlist

    ## $scores
    ## NULL
    ##
    ## $season
    ## [1] "2010-2011"

    ### Adding extra elements using indices
    baskets.nlist$players <- c("Granny", "Geraldine")
    baskets.nlist[["players"]] <- c("Granny", "Geraldine")
    baskets.nlist["players"] <- list(c("Granny", "Geraldine"))
    baskets.list[[3]] <- c("Granny", "Geraldine")
    baskets.list[3] <- list(c("Granny", "Geraldine"))
    ### Combining lists
    baskets.list <- list(baskets.team, "2010-2011")
    players <- list(rownames(baskets.team))
    c(baskets.list, players)

    ## [[1]]
    ##           1st 2nd 3rd 4th 5th 6th
    ## Granny     12   4   5   6   9   3
    ## Geraldine   5   4   2   4  12   9
    ##
    ## [[2]]
    ## [1] "2010-2011"
    ##
    ## [[3]]
    ## [1] "Granny"    "Geraldine"

    ## Reading the output of str() for lists
    str(baskets.list)

    ## List of 2
    ##  $ : num [1:2, 1:6] 12 5 4 4 5 2 6 4 9 12 ...
    ##   ..- attr(*, "dimnames")=List of 2
    ##   .. ..$ : chr [1:2] "Granny" "Geraldine"
    ##   .. ..$ : chr [1:6] "1st" "2nd" "3rd" "4th" ...
    ##  $ : chr "2010-2011"

    ## Seeing the forest through the trees

The R session information (including the OS info, R version and all packages used):

    sessionInfo()

    ## R version 3.0.2 (2013-09-25)
    ## Platform: x86_64-w64-mingw32/x64 (64-bit)
    ##
    ## locale:
    ## [1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252
    ## [3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
    ## [5] LC_TIME=English_United Kingdom.1252
    ##
    ## attached base packages:
    ## [1] stats     graphics  grDevices utils     datasets  methods   base
    ##
    ## other attached packages:
    ##  [1] BiocInstaller_1.12.1 ggplot2_0.9.3.1      reshape2_1.2.2       sos_1.3-8
    ##  [5] brew_1.0-6           stringr_0.6.2        knitr_1.5            plyr_1.8
    ##  [9] Revobase_7.1.0       RevoMods_7.1.0       RevoScaleR_7.1.0     lattice_0.20-27
    ## [13] rpart_4.1-2
    ##
    ## loaded via a namespace (and not attached):
    ##  [1] codetools_0.2-8    colorspace_1.2-4   dichromat_2.0-0    digest_0.6.4
    ##  [5] evaluate_0.5.1     foreach_1.4.1      formatR_0.10       fortunes_1.5-2
    ##  [9] grid_3.0.2         gtable_0.1.2       highr_0.3          iterators_1.0.6
    ## [13] labeling_0.2       MASS_7.3-29        munsell_0.4.2      proto_0.3-10
    ## [17] RColorBrewer_1.0-5 scales_0.2.3       tools_3.0.2

    Sys.time()

    ## [1] "2014-05-13 15:05:40 BST"