This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

plot(cars)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

Download R and Rstudio

Download the latest version of Rstudio here: https://www.rstudio.com/products/rstudio/download/

If you don’t have R, download it here: https://cran.rstudio.com/

Numerical Vectors

Assignment

Vector is a single entity consisting of an ordered collection of numbers.

x <- c(1,2,3,4,5)
print(x)
y <- c(x, 0, x)
y

Vector arithmetic

Vectors can be used in arithmetic expressions, in which case the operations are performed element by element.

a <- c(1,2,3)
b <- c(4,5,6)
a + b

If the vectors are not of the same length, shorter vectors in the expression are recycled as often as need be (perhaps fractionally) until they match the length of the longest vector.

d <- c(4,5,6,7,8,9)
a + d

In this case, the vector “a” is automatically recycled to be [1 2 3 1 2 3].

Common functions

x <- c(1,2,3,4,5,6,6,6)
max(x) # largest element
min(x) # smallest element
sum(x) # the total of the elements in x
prod(x) # the product

Generate sequence

a <- 1:10
a
b <- seq(0,5,by=.5)
b

By default, by is set to be 1.

c <- seq(1,5)
c

You can also specify the length of the vector.

d <- seq(1,5,length.out = 9)
d
length(d)

Another useful function is rep, which replicates an object in various complicated ways. You can repeat a single value.

rep(1, times = 5)

You can also repeat a vector. By setting the parameter times, you will put the vector end-to-end in a new vector. By setting each, you will repeat each element of the vector before proceeding to the next one.

a <- 1:5
rep(a, times = 3)
rep(a, each = 3)

Logical Vectors

The elements of a logical vector can have the values TRUE, FALSE, and NA (for “not available”, see below).

x <- 10
logical <- x > 5
logical

You can also test a vector. In this case, the test will be on each element.

x <- c(1,2,3,4,5)
x > 3

The logical operators are <, <=, >, >=, == for exact equality and != for inequality. In addition if c1 and c2 are logical expressions, then c1 & c2 is their intersection (and), c1 | c2 is their union (or), and !c1 is the negation of c1.

c1 <- c(TRUE, TRUE, FALSE)
c2 <- c(TRUE, FALSE, FALSE)
c1 | c2
c1 & c2
!c1

Character Vectors

We can also store characters in a vector. In the following case, the numerical number 189 is automatically transfered to character.

char1 <- c("Math", 189, "is", "fun")
char1

One very useful function for character vector is paste. The paste() function takes an arbitrary number of arguments and concatenates them one by one into character strings.

paste("Math", 189)
paste(c("Math", "CSE"), c(100, 120))
paste(c("Math", "CSE"), c(100, 120), sep = "")

Index of Vectors

Given a vector, in many cases we want to modify a subset of that vector. Here are some common ways to subset.

Logical subset

Choose the elements of x that are larger than 3.

x <- c(1,2,3,4,5)
y <- x[x > 3]
y

Choose the elements of x that are not NA.

x <- c(1,2,3,NA,5)
y <- x[!is.na(x)]
y
x <- c(1,2,3,NA,5,6,NA)
x[!is.na(x) & x>2]

Positive integer index

The index in this case must lie in the set {1, 2, . . ., length(x)}. Remember, the index set has to be a number of a vector itself. In the following example, if you directly type x[1,3,6], you will get an error message.

x <- c(1,2,4,5,7,10,15)
x[c(1,3,6)]

The corresponding elements of the vector are selected and concatenated, in that order, in the result.

x <- c(1,2,4,5,7,10,15)
x[c(3,3,1,1,1,1,1,2)]

Negative integer index

A negative index specifies the values to be excluded rather than included.

x <- c(1,3,10,189,289)
x[-(1:3)]

Character index

You can subset using character index only when an object has a names attribute to identify its components.

grades <- c(100, 90, 87, 95, 95)
names(grades) <- c("Jelena", "Alice", "Aaron", "Alex", "Jiaqi")
lab <- grades[c("Jelena", "Alex", "Jiaqi")]
lab

Array and Matrix

Array

The largest difference between array and vector is **array* object has a dim attribute. The dim of a vector is NULL.

x <- c(1,2,3,4,5)
dim(x)
class(x)

We can assign a dim attribute to make it an 1-by-5 array (matrix).

dim(x) <- c(1,5)
class(x)
x

Now let’s create a 4-by-5 matrix.

x <- 1:20
dim(x) <- c(4,5)
x

A more quick way to create the array(matrix) in previous example.

x <- array(1:20, dim=c(4,5))
x

Index of array

Extract a subarray (submatrix).

x <- array(1:20, dim=c(4,5))
x[3,4]
x[c(1,3,4), c(2,5)]

Class

At the end of lab 1, we will talk about class. All objects in R have a class, reported by the function class. It can be used to allow for an object-oriented style of programming in R. For example, in the later labs, we will learn different regression methods. Most of them will share the same prediction function predict. However, when you pass in different classes, the predict function will react to the argument sensitive to its class.

x <- NA
class(x)
x <- c(1,2,3)
class(x)
x <- array(1:4, dim=c(2,2))
class(x)
LS0tCnRpdGxlOiAiTWF0aCAxODkvMjg5IExhYiAxIgphdXRob3I6ICJBbGV4IExpIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIAoKVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkNtZCtTaGlmdCtFbnRlciouIAoKYGBge3J9CnBsb3QoY2FycykKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuCgojIERvd25sb2FkIFIgYW5kIFJzdHVkaW8KRG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFJzdHVkaW8gaGVyZTogaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC8KCklmIHlvdSBkb24ndCBoYXZlIFIsIGRvd25sb2FkIGl0IGhlcmU6Cmh0dHBzOi8vY3Jhbi5yc3R1ZGlvLmNvbS8KCiMgTnVtZXJpY2FsIFZlY3RvcnMKIyMjIEFzc2lnbm1lbnQKVmVjdG9yIGlzIGEgc2luZ2xlIGVudGl0eSBjb25zaXN0aW5nIG9mIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBudW1iZXJzLgpgYGB7cn0KeCA8LSBjKDEsMiwzLDQsNSkKcHJpbnQoeCkKYGBgCmBgYHtyfQp5IDwtIGMoeCwgMCwgeCkKeQpgYGAKCiMjIyBWZWN0b3IgYXJpdGhtZXRpYwpWZWN0b3JzIGNhbiBiZSB1c2VkIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMsIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBlbGVtZW50IGJ5IGVsZW1lbnQuCmBgYHtyfQphIDwtIGMoMSwyLDMpCmIgPC0gYyg0LDUsNikKYSArIGIKYGBgCklmIHRoZSB2ZWN0b3JzIGFyZSBub3Qgb2YgdGhlIHNhbWUgbGVuZ3RoLCBzaG9ydGVyIHZlY3RvcnMgaW4gdGhlIGV4cHJlc3Npb24gYXJlIHJlY3ljbGVkIGFzIG9mdGVuIGFzIG5lZWQgYmUgKHBlcmhhcHMgZnJhY3Rpb25hbGx5KSB1bnRpbCB0aGV5IG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgdmVjdG9yLgpgYGB7cn0KZCA8LSBjKDQsNSw2LDcsOCw5KQphICsgZApgYGAKSW4gdGhpcyBjYXNlLCB0aGUgdmVjdG9yICJhIiBpcyBhdXRvbWF0aWNhbGx5IHJlY3ljbGVkIHRvIGJlIFsxIDIgMyAxIDIgM10uCgojIyMgQ29tbW9uIGZ1bmN0aW9ucwpgYGB7cn0KeCA8LSBjKDEsMiwzLDQsNSw2LDYsNikKbWF4KHgpICMgbGFyZ2VzdCBlbGVtZW50Cm1pbih4KSAjIHNtYWxsZXN0IGVsZW1lbnQKc3VtKHgpICMgdGhlIHRvdGFsIG9mIHRoZSBlbGVtZW50cyBpbiB4CnByb2QoeCkgIyB0aGUgcHJvZHVjdApgYGAKCiMjIyBHZW5lcmF0ZSBzZXF1ZW5jZQpgYGB7cn0KYSA8LSAxOjEwCmEKYiA8LSBzZXEoMCw1LGJ5PS41KQpiCmBgYApCeSBkZWZhdWx0LCAqYnkqIGlzIHNldCB0byBiZSAxLgpgYGB7cn0KYyA8LSBzZXEoMSw1KQpjCmBgYApZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IuCmBgYHtyfQpkIDwtIHNlcSgxLDUsbGVuZ3RoLm91dCA9IDkpCmQKbGVuZ3RoKGQpCmBgYApBbm90aGVyIHVzZWZ1bCBmdW5jdGlvbiBpcyBgcmVwYCwgd2hpY2ggcmVwbGljYXRlcyBhbiBvYmplY3QgaW4gdmFyaW91cyBjb21wbGljYXRlZAp3YXlzLiBZb3UgY2FuIHJlcGVhdCBhIHNpbmdsZSB2YWx1ZS4KYGBge3J9CnJlcCgxLCB0aW1lcyA9IDUpCmBgYApZb3UgY2FuIGFsc28gcmVwZWF0IGEgdmVjdG9yLiBCeSBzZXR0aW5nIHRoZSBwYXJhbWV0ZXIgYHRpbWVzYCwgeW91IHdpbGwgcHV0IHRoZSB2ZWN0b3IgZW5kLXRvLWVuZCBpbiBhIG5ldyB2ZWN0b3IuIEJ5IHNldHRpbmcgYGVhY2hgLCB5b3Ugd2lsbCByZXBlYXQgZWFjaCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlIG5leHQgb25lLgpgYGB7cn0KYSA8LSAxOjUKcmVwKGEsIHRpbWVzID0gMykKcmVwKGEsIGVhY2ggPSAzKQpgYGAKCiMgTG9naWNhbCBWZWN0b3JzClRoZSBlbGVtZW50cyBvZiBhIGxvZ2ljYWwgdmVjdG9yIGNhbiBoYXZlIHRoZSB2YWx1ZXMgKipUUlVFKiosICoqRkFMU0UqKiwgYW5kICoqTkEqKiAoZm9yIOKAnG5vdCBhdmFpbGFibGXigJ0sIHNlZSBiZWxvdykuCmBgYHtyfQp4IDwtIDEwCmxvZ2ljYWwgPC0geCA+IDUKbG9naWNhbApgYGAKWW91IGNhbiBhbHNvIHRlc3QgYSB2ZWN0b3IuIEluIHRoaXMgY2FzZSwgdGhlIHRlc3Qgd2lsbCBiZSBvbiBlYWNoIGVsZW1lbnQuCmBgYHtyfQp4IDwtIGMoMSwyLDMsNCw1KQp4ID4gMwpgYGAKVGhlIGxvZ2ljYWwgb3BlcmF0b3JzIGFyZSBgPCwgPD0sID4sID49LCA9PWAgZm9yIGV4YWN0IGVxdWFsaXR5IGFuZCBgIT1gIGZvciBpbmVxdWFsaXR5LiBJbiBhZGRpdGlvbiBpZiBjMSBhbmQgYzIgYXJlIGxvZ2ljYWwgZXhwcmVzc2lvbnMsIHRoZW4gYGMxICYgYzJgIGlzIHRoZWlyIGludGVyc2VjdGlvbiAoYW5kKSwgYGMxIHwgYzJgIGlzIHRoZWlyIHVuaW9uIChvciksIGFuZCBgIWMxYCBpcyB0aGUgbmVnYXRpb24gb2YgYzEuCmBgYHtyfQpjMSA8LSBjKFRSVUUsIFRSVUUsIEZBTFNFKQpjMiA8LSBjKFRSVUUsIEZBTFNFLCBGQUxTRSkKYzEgfCBjMgpjMSAmIGMyCiFjMQpgYGAKCiMgQ2hhcmFjdGVyIFZlY3RvcnMKV2UgY2FuIGFsc28gc3RvcmUgY2hhcmFjdGVycyBpbiBhIHZlY3Rvci4gSW4gdGhlIGZvbGxvd2luZyBjYXNlLCB0aGUgbnVtZXJpY2FsIG51bWJlciBgMTg5YCBpcyBhdXRvbWF0aWNhbGx5IHRyYW5zZmVyZWQgdG8gY2hhcmFjdGVyLgpgYGB7cn0KY2hhcjEgPC0gYygiTWF0aCIsIDE4OSwgImlzIiwgImZ1biIpCmNoYXIxCmBgYApPbmUgdmVyeSB1c2VmdWwgZnVuY3Rpb24gZm9yIGNoYXJhY3RlciB2ZWN0b3IgaXMgYHBhc3RlYC4gVGhlIGBwYXN0ZSgpYCBmdW5jdGlvbiB0YWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgY29uY2F0ZW5hdGVzIHRoZW0gb25lIGJ5IG9uZSBpbnRvIGNoYXJhY3RlciBzdHJpbmdzLgpgYGB7cn0KcGFzdGUoIk1hdGgiLCAxODkpCnBhc3RlKGMoIk1hdGgiLCAiQ1NFIiksIGMoMTAwLCAxMjApKQpwYXN0ZShjKCJNYXRoIiwgIkNTRSIpLCBjKDEwMCwgMTIwKSwgc2VwID0gIiIpCmBgYAoKIyBJbmRleCBvZiBWZWN0b3JzCkdpdmVuIGEgdmVjdG9yLCBpbiBtYW55IGNhc2VzIHdlIHdhbnQgdG8gbW9kaWZ5IGEgc3Vic2V0IG9mIHRoYXQgdmVjdG9yLiBIZXJlIGFyZSBzb21lIGNvbW1vbiB3YXlzIHRvIHN1YnNldC4KCiMjIyBMb2dpY2FsIHN1YnNldApDaG9vc2UgdGhlIGVsZW1lbnRzIG9mIGB4YCB0aGF0IGFyZSBsYXJnZXIgdGhhbiAzLgpgYGB7cn0KeCA8LSBjKDEsMiwzLDQsNSkKeSA8LSB4W3ggPiAzXQp5CmBgYApDaG9vc2UgdGhlIGVsZW1lbnRzIG9mIGB4YCB0aGF0IGFyZSBub3QgTkEuCmBgYHtyfQp4IDwtIGMoMSwyLDMsTkEsNSkKeSA8LSB4WyFpcy5uYSh4KV0KeQpgYGAKYGBge3J9CnggPC0gYygxLDIsMyxOQSw1LDYsTkEpCnhbIWlzLm5hKHgpICYgeD4yXQpgYGAKCiMjIyBQb3NpdGl2ZSBpbnRlZ2VyIGluZGV4ClRoZSBpbmRleCBpbiB0aGlzIGNhc2UgbXVzdCBsaWUgaW4gdGhlIHNldCBgIHsxLCAyLCAuIC4gLiwgbGVuZ3RoKHgpfWAuIFJlbWVtYmVyLCB0aGUgaW5kZXggc2V0IGhhcyB0byBiZSBhIG51bWJlciBvZiBhIHZlY3RvciBpdHNlbGYuIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgaWYgeW91IGRpcmVjdGx5IHR5cGUgYHhbMSwzLDZdYCwgeW91IHdpbGwgZ2V0IGFuIGVycm9yIG1lc3NhZ2UuCmBgYHtyfQp4IDwtIGMoMSwyLDQsNSw3LDEwLDE1KQp4W2MoMSwzLDYpXQpgYGAKVGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhlIHZlY3RvciBhcmUgc2VsZWN0ZWQgYW5kIGNvbmNhdGVuYXRlZCwgKippbiB0aGF0IG9yZGVyKiosIGluIHRoZSByZXN1bHQuIApgYGB7cn0KeCA8LSBjKDEsMiw0LDUsNywxMCwxNSkKeFtjKDMsMywxLDEsMSwxLDEsMildCmBgYAoKIyMjIE5lZ2F0aXZlIGludGVnZXIgaW5kZXgKQSBuZWdhdGl2ZSBpbmRleCBzcGVjaWZpZXMgdGhlIHZhbHVlcyB0byBiZSBleGNsdWRlZCByYXRoZXIgdGhhbiBpbmNsdWRlZC4KYGBge3J9CnggPC0gYygxLDMsMTAsMTg5LDI4OSkKeFstKDE6MyldCmBgYAoKIyMjIENoYXJhY3RlciBpbmRleApZb3UgY2FuIHN1YnNldCB1c2luZyBjaGFyYWN0ZXIgaW5kZXggb25seSB3aGVuIGFuIG9iamVjdCBoYXMgYSBgbmFtZXNgIGF0dHJpYnV0ZSB0byBpZGVudGlmeSBpdHMgY29tcG9uZW50cy4KYGBge3J9CmdyYWRlcyA8LSBjKDEwMCwgOTAsIDg3LCA5NSwgOTUpCm5hbWVzKGdyYWRlcykgPC0gYygiSmVsZW5hIiwgIkFsaWNlIiwgIkFhcm9uIiwgIkFsZXgiLCAiSmlhcWkiKQpsYWIgPC0gZ3JhZGVzW2MoIkplbGVuYSIsICJBbGV4IiwgIkppYXFpIildCmxhYgpgYGAKCiMgQXJyYXkgYW5kIE1hdHJpeAojIyMgQXJyYXkKVGhlIGxhcmdlc3QgZGlmZmVyZW5jZSBiZXR3ZWVuICoqYXJyYXkqKiBhbmQgKip2ZWN0b3IqKiBpcyAqKmFycmF5KiBvYmplY3QgaGFzIGEgYGRpbWAgYXR0cmlidXRlLiBUaGUgYGRpbWAgb2YgYSB2ZWN0b3IgaXMgYE5VTExgLgpgYGB7cn0KeCA8LSBjKDEsMiwzLDQsNSkKZGltKHgpCmNsYXNzKHgpCmBgYApXZSBjYW4gYXNzaWduIGEgYGRpbWAgYXR0cmlidXRlIHRvIG1ha2UgaXQgYW4gMS1ieS01IGFycmF5IChtYXRyaXgpLgpgYGB7cn0KZGltKHgpIDwtIGMoMSw1KQpjbGFzcyh4KQp4CmBgYAoKTm93IGxldCdzIGNyZWF0ZSBhIDQtYnktNSBtYXRyaXguCmBgYHtyfQp4IDwtIDE6MjAKZGltKHgpIDwtIGMoNCw1KQp4CmBgYAoKQSBtb3JlIHF1aWNrIHdheSB0byBjcmVhdGUgdGhlIGFycmF5KG1hdHJpeCkgaW4gcHJldmlvdXMgZXhhbXBsZS4KYGBge3J9CnggPC0gYXJyYXkoMToyMCwgZGltPWMoNCw1KSkKeApgYGAKCiMjIyBJbmRleCBvZiBhcnJheQpFeHRyYWN0IGEgc3ViYXJyYXkgKHN1Ym1hdHJpeCkuCmBgYHtyfQp4IDwtIGFycmF5KDE6MjAsIGRpbT1jKDQsNSkpCnhbMyw0XQp4W2MoMSwzLDQpLCBjKDIsNSldCmBgYAoKIyBDbGFzcwpBdCB0aGUgZW5kIG9mIGxhYiAxLCB3ZSB3aWxsIHRhbGsgYWJvdXQgY2xhc3MuIEFsbCBvYmplY3RzIGluIFIgaGF2ZSBhIGNsYXNzLCByZXBvcnRlZCBieSB0aGUgZnVuY3Rpb24gYGNsYXNzYC4gSXQgY2FuIGJlIHVzZWQgdG8gYWxsb3cgZm9yIGFuIG9iamVjdC1vcmllbnRlZCBzdHlsZSBvZiBwcm9ncmFtbWluZyBpbiBSLiBGb3IgZXhhbXBsZSwgaW4gdGhlIGxhdGVyIGxhYnMsIHdlIHdpbGwgbGVhcm4gZGlmZmVyZW50IHJlZ3Jlc3Npb24gbWV0aG9kcy4gTW9zdCBvZiB0aGVtIHdpbGwgc2hhcmUgdGhlIHNhbWUgcHJlZGljdGlvbiBmdW5jdGlvbiBgcHJlZGljdGAuIEhvd2V2ZXIsIHdoZW4geW91IHBhc3MgaW4gZGlmZmVyZW50IGNsYXNzZXMsIHRoZSBgcHJlZGljdGAgZnVuY3Rpb24gd2lsbCByZWFjdCB0byB0aGUgYXJndW1lbnQgc2Vuc2l0aXZlIHRvIGl0cyBjbGFzcy4KYGBge3J9CnggPC0gTkEKY2xhc3MoeCkKeCA8LSBjKDEsMiwzKQpjbGFzcyh4KQp4IDwtIGFycmF5KDE6NCwgZGltPWMoMiwyKSkKY2xhc3MoeCkKYGBgCgo=