Watch the video series for Session 2
Watch the video lecture associated to Session 2 (find the link on the website and here) – these are a series of short videos that will walk you through some of the basic syntax in R. In particular, we ask that you watch the videos in that link entitled:
Once you’re done, go through the following exercises to get more familiar with the R syntax.
Exercise 0: Swirl courses
The purpose of this first lab is to familiarize yourself with the R language. To this end, we will use one of the Swirl courses (which we installed during the discussion session).
Installation:
library(swirl)
install_course_github("swirldev", "R_Programming_E")
swirl()
This will initiate a series of prompts:
- Type 1 for “1: R Programming: The basics of programming in R” when prompted to install a course.
- Type 1 for “1: R Programming” when prompted to choose a course.
Go through lessons 1 through 11.
Once you’re done, prepare the following exercises which we will go over during the discussion.
Exercise 1: Vectors
- Generate and print a vector of 10 random numbers between 5 and 500.
- Generate a random vector Z of 1000 letters (from “a” to “z”). Hint: the variable
letters
is already defined in R.
- Print a summary of Z in the form of a frequency table.
- Print the list of letters that appear an even number of times in Z.
Exercise 2: Matrices
- Create the following 5 by 5 matrix and store it as variable X.
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
Create a matrix Y by adding an independent Gaussian noise (random numbers) with mean 0 and standard deviation 1 to each entry of X. Hint: use the rnorm
function.
Find the inverse of Y. Hint: use the solve
function.
Show numerically that the matrix product of Y and its inverse is the identity matrix. Hint: use the %*%
matrix multiplication operator.
Exercise 3: Data frames
- Create the following data frame and name it “exams”.
set.seed(123)
data.frame(
student = c("Alice", "Sarah", "Harry", "Ron", "Kate"),
score = sample(80:100, 5),
letter = sample(c("A","B"), 5, replace = TRUE),
late = sample(c(T, F), 5, replace = TRUE)
)
Compute the mean score for this exam and print it.
Find the student with the highest score and print the corresponding row of “exams”. Hint: use the function which.max()
.
Exercise 4: Control Flow
Part 1
Use a “for”" loop to:
Print all the letters of the Latin alphabet.
Print the numbers 10 to 100 that are divisible by 7
Print the numbers 1 to 100 that are divisible by 5 but not by 3.
Part 2
Find all numbers not greater than 10,000 that are divisible by 5, 7 and 11 and print them.
Print for each of the numbers x = 2, . . . 20, all numbers that divide x (all factors) excluding 1 and x. Hence, for 18, it should print 2 3 6 9.
Exercise 5: Functions
Part 1
Create a function what will return the number of times a given integer is contained a given vector of integers. The function should have two arguments one for a vector and the other for a scalar.
Then, generate a random vector of 100 integers (in a range 1-20) use the function to count the number of times the number 12 is in that vector.
Part 2
Write a function that takes in a data.frame as an input, prints out the column names, and returns its dimensions.
Exercise 6: Apply family functions
Part 1
Below we print six first rows of the built-in dataset, mtcars
, from the 1974 Motor Trend US magazine, which comprises information on the fuel consumption and 10 aspects of automobile design and performance for 32 selected car models.
head(mtcars)
Use apply()
function to find the standard deviation and the 0.8-quantile of each of the automobile characteristic.
Part 2
Below is a vector of dates in year 2018. Hint: you might find the ceiling
function useful.
set.seed(1234)
y2018 <- seq(as.Date("2018-01-01", format = "%Y-%m-%d"),
as.Date("2018-12-31", format = "%Y-%m-%d"),
"days")
length(y2018)
# A random sample of 10 dates from 2018
y2018_sample <- sample(y2018, size = 10)
y2018_sample
Use an apply
family function to return the number of weeks left from each day in y2018_sample
to the New Year, 2019/01/01.
Note: you can calculate the difference between Date objects.
as.Date("2019-01-01", format = "%Y-%m-%d") - as.Date("2018-01-01", format = "%Y-%m-%d")
Time difference of 365 days
LS0tCnRpdGxlOiAiTGFiIDIiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgc2VsZl9jb250YWluZWQ6IHllcwpkYXRlOiAiSnVseSAxc3QsIDIwMjAiCnN1YnRpdGxlOiBCYXNpY3Mgb2YgQ29kaW5nIGluIFIKLS0tCgojIFdhdGNoIHRoZSB2aWRlbyBzZXJpZXMgZm9yIFNlc3Npb24gMgoKV2F0Y2ggdGhlIHZpZGVvIGxlY3R1cmUgYXNzb2NpYXRlZCB0byBTZXNzaW9uIDIgKGZpbmQgdGhlIGxpbmsgb24gdGhlIHdlYnNpdGUgYW5kIFtoZXJlXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWlmZlIzZld2NHh3Jmxpc3Q9UExPVTJYTFl4bXNJSzlxUWZ6dFhleWJwSHZydS1UcnFBUCkpIC0tIHRoZXNlIGFyZSBhIHNlcmllcyBvZiBzaG9ydCB2aWRlb3MgdGhhdCB3aWxsIHdhbGsgeW91IHRocm91Z2ggc29tZSBvZiB0aGUgYmFzaWMgc3ludGF4IGluIFIuIEluIHBhcnRpY3VsYXIsIHdlIGFzayB0aGF0IHlvdSB3YXRjaCB0aGUgdmlkZW9zIGluIHRoYXQgbGluayBlbnRpdGxlZDoKCi0gUiBbMS4xXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWlmZlIzZld2NHh3Jmxpc3Q9UExPVTJYTFl4bXNJSzlxUWZ6dFhleWJwSHZydS1UcnFBUCZpbmRleD0xKSwgWzEuMl0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1TLW8tc2RsemhrRSZsaXN0PVBMT1UyWExZeG1zSUs5cVFmenRYZXlicEh2cnUtVHJxQVAmaW5kZXg9MiksIFsxLjNdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WWhRT1YyN3BRZmcmbGlzdD1QTE9VMlhMWXhtc0lLOXFRZnp0WGV5YnBIdnJ1LVRycUFQJmluZGV4PTMpLCBbMS40XShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUdLdTV0d19iSXBBJmxpc3Q9UExPVTJYTFl4bXNJSzlxUWZ6dFhleWJwSHZydS1UcnFBUCZpbmRleD00KSwgWzEuNV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj11NWhyb3l4MEo0byZsaXN0PVBMT1UyWExZeG1zSUs5cVFmenRYZXlicEh2cnUtVHJxQVAmaW5kZXg9NSksIFsxLjZdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9Y1ItaEVVczFyUncmbGlzdD1QTE9VMlhMWXhtc0lLOXFRZnp0WGV5YnBIdnJ1LVRycUFQJmluZGV4PTYpLCBhbmQgWzEuN10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1jUi1oRVVzMXJSdyZsaXN0PVBMT1UyWExZeG1zSUs5cVFmenRYZXlicEh2cnUtVHJxQVAmaW5kZXg9NykKCi0gUiBbMi4xXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXFLMUVsVU1raHEwJmxpc3Q9UExPVTJYTFl4bXNJSzlxUWZ6dFhleWJwSHZydS1UcnFBUCZpbmRleD04KSwgUiBbMi4zXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWVWRXhfcEJFa1JJJmxpc3Q9UExPVTJYTFl4bXNJSzlxUWZ6dFhleWJwSHZydS1UcnFBUCZpbmRleD0xMCkgYW5kIFIgWzIuNF0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1kakkteWZrLURaTSZsaXN0PVBMT1UyWExZeG1zSUs5cVFmenRYZXlicEh2cnUtVHJxQVAmaW5kZXg9MTEpCgotIFIgWzMuMl0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1XdUNWczNiVy1aWSZsaXN0PVBMT1UyWExZeG1zSUs5cVFmenRYZXlicEh2cnUtVHJxQVAmaW5kZXg9MTQpCgotIFIgWzQuMV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1aMXdCMXJIQVl6USZsaXN0PVBMT1UyWExZeG1zSUs5cVFmenRYZXlicEh2cnUtVHJxQVAmaW5kZXg9MTYpCgpPbmNlIHlvdSdyZSBkb25lLCBnbyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgZXhlcmNpc2VzIHRvIGdldCBtb3JlIGZhbWlsaWFyIHdpdGggdGhlIFIgc3ludGF4LgoKCiMgRXhlcmNpc2UgMDogU3dpcmwgY291cnNlcwoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaXJzdCBsYWIgaXMgdG8gZmFtaWxpYXJpemUgeW91cnNlbGYgd2l0aCB0aGUgUiBsYW5ndWFnZS4gClRvIHRoaXMgZW5kLCB3ZSB3aWxsIHVzZSBvbmUgb2YgdGhlIFN3aXJsIGNvdXJzZXMgKHdoaWNoIHdlIGluc3RhbGxlZCBkdXJpbmcgdGhlIGRpc2N1c3Npb24gc2Vzc2lvbikuCgpJbnN0YWxsYXRpb246CgpgYGB7ciBjYXJzLCBldmFsPUZBTFNFfQpsaWJyYXJ5KHN3aXJsKQppbnN0YWxsX2NvdXJzZV9naXRodWIoInN3aXJsZGV2IiwgIlJfUHJvZ3JhbW1pbmdfRSIpCnN3aXJsKCkKYGBgCgpUaGlzIHdpbGwgaW5pdGlhdGUgYSBzZXJpZXMgb2YgcHJvbXB0czoKCi0gVHlwZSAxIGZvciAiMTogUiBQcm9ncmFtbWluZzogVGhlIGJhc2ljcyBvZiBwcm9ncmFtbWluZyBpbiBSIiB3aGVuIHByb21wdGVkIHRvIGluc3RhbGwgYSBjb3Vyc2UuCi0gVHlwZSAxIGZvciAiMTogUiBQcm9ncmFtbWluZyIgd2hlbiBwcm9tcHRlZCB0byBjaG9vc2UgYSBjb3Vyc2UuCgpHbyB0aHJvdWdoIGxlc3NvbnMgMSB0aHJvdWdoIDExLgoKT25jZSB5b3UncmUgZG9uZSwgcHJlcGFyZSB0aGUgZm9sbG93aW5nIGV4ZXJjaXNlcyB3aGljaCB3ZSB3aWxsIGdvIG92ZXIgZHVyaW5nIHRoZSBkaXNjdXNzaW9uLgoKIyBFeGVyY2lzZSAxOiBWZWN0b3JzCgoxLiBHZW5lcmF0ZSBhbmQgcHJpbnQgYSB2ZWN0b3Igb2YgMTAgcmFuZG9tIG51bWJlcnMgYmV0d2VlbiA1IGFuZCA1MDAuCjIuIEdlbmVyYXRlIGEgcmFuZG9tIHZlY3RvciBaIG9mIDEwMDAgbGV0dGVycyAoZnJvbSAiYSIgdG8gInoiKS4gSGludDogdGhlIHZhcmlhYmxlIGBsZXR0ZXJzYCBpcyBhbHJlYWR5IGRlZmluZWQgaW4gUi4KMy4gUHJpbnQgYSBzdW1tYXJ5IG9mIFogaW4gdGhlIGZvcm0gb2YgYSBmcmVxdWVuY3kgdGFibGUuCjQuIFByaW50IHRoZSBsaXN0IG9mIGxldHRlcnMgdGhhdCBhcHBlYXIgYW4gZXZlbiBudW1iZXIgb2YgdGltZXMgaW4gWi4KCiMgRXhlcmNpc2UgMjogTWF0cmljZXMKCjEuIENyZWF0ZSB0aGUgZm9sbG93aW5nIDUgYnkgNSBtYXRyaXggYW5kIHN0b3JlIGl0IGFzIHZhcmlhYmxlIFguCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9Cm1hdHJpeCgxOjI1LCBucm93ID0gNSwgYnlyb3cgPSBGQUxTRSkKYGBgCgoyLiBDcmVhdGUgYSBtYXRyaXggWSBieSBhZGRpbmcgYW4gaW5kZXBlbmRlbnQgR2F1c3NpYW4gbm9pc2UgKHJhbmRvbSBudW1iZXJzKSB3aXRoIG1lYW4gMCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIDEgdG8gZWFjaCBlbnRyeSBvZiBYLiBIaW50OiB1c2UgdGhlIGBybm9ybWAgZnVuY3Rpb24uCgozLiBGaW5kIHRoZSBpbnZlcnNlIG9mIFkuIEhpbnQ6IHVzZSB0aGUgYHNvbHZlYCBmdW5jdGlvbi4KCjQuIFNob3cgbnVtZXJpY2FsbHkgdGhhdCB0aGUgbWF0cml4IHByb2R1Y3Qgb2YgWSBhbmQgaXRzIGludmVyc2UgaXMgdGhlIGlkZW50aXR5IG1hdHJpeC4gSGludDogdXNlIHRoZSBgJSolYCBtYXRyaXggbXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCgoKIyBFeGVyY2lzZSAzOiBEYXRhIGZyYW1lcwoKMS4gQ3JlYXRlIHRoZSBmb2xsb3dpbmcgZGF0YSBmcmFtZSBhbmQgbmFtZSBpdCDigJxleGFtc+KAnS4KCmBgYHtyLCBlY2hvID0gVFJVRX0Kc2V0LnNlZWQoMTIzKQpkYXRhLmZyYW1lKAogIHN0dWRlbnQgPSBjKCJBbGljZSIsICJTYXJhaCIsICJIYXJyeSIsICJSb24iLCAiS2F0ZSIpLAogIHNjb3JlID0gc2FtcGxlKDgwOjEwMCwgNSksCiAgbGV0dGVyID0gc2FtcGxlKGMoIkEiLCJCIiksIDUsIHJlcGxhY2UgPSBUUlVFKSwKICBsYXRlID0gc2FtcGxlKGMoVCwgRiksIDUsIHJlcGxhY2UgPSBUUlVFKQopCmBgYAoKMi4gQ29tcHV0ZSB0aGUgbWVhbiBzY29yZSBmb3IgdGhpcyBleGFtIGFuZCBwcmludCBpdC4KCjMuIEZpbmQgdGhlIHN0dWRlbnQgd2l0aCB0aGUgaGlnaGVzdCBzY29yZSBhbmQgcHJpbnQgdGhlIGNvcnJlc3BvbmRpbmcgcm93IG9mICJleGFtcyIuIEhpbnQ6IHVzZSB0aGUgZnVuY3Rpb24gYHdoaWNoLm1heCgpYC4KCgojIEV4ZXJjaXNlIDQ6IENvbnRyb2wgRmxvdyAKCiMjIFBhcnQgMQoKVXNlIGEgImZvciIiIGxvb3AgdG86CgphLiBQcmludCBhbGwgdGhlIGxldHRlcnMgb2YgdGhlIExhdGluIGFscGhhYmV0LgoKYi4gUHJpbnQgdGhlIG51bWJlcnMgMTAgdG8gMTAwIHRoYXQgYXJlIGRpdmlzaWJsZSBieSA3CgpjLiBQcmludCB0aGUgbnVtYmVycyAxIHRvIDEwMCB0aGF0IGFyZSBkaXZpc2libGUgYnkgNSBidXQgbm90IGJ5IDMuCgoKCiMjIFBhcnQgMgoKYS4gRmluZCBhbGwgbnVtYmVycyBub3QgZ3JlYXRlciB0aGFuIDEwLDAwMCB0aGF0IGFyZSBkaXZpc2libGUgYnkgNSwgNyBhbmQgMTEgYW5kIHByaW50IHRoZW0uCgpiLiBQcmludCBmb3IgZWFjaCBvZiB0aGUgbnVtYmVycyB4ID0gMiwgLiAuIC4gMjAsIGFsbCBudW1iZXJzIHRoYXQgZGl2aWRlIHggKGFsbCBmYWN0b3JzKSBleGNsdWRpbmcgMSBhbmQgeC4gSGVuY2UsIGZvciAxOCwgaXQgc2hvdWxkIHByaW50IDIgMyA2IDkuCgoKIyBFeGVyY2lzZSA1OiBGdW5jdGlvbnMKCiMjIFBhcnQgMQoKYS4gQ3JlYXRlIGEgZnVuY3Rpb24gd2hhdCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZ2l2ZW4gaW50ZWdlciBpcyBjb250YWluZWQgYSBnaXZlbiB2ZWN0b3Igb2YgaW50ZWdlcnMuIFRoZSBmdW5jdGlvbiBzaG91bGQgaGF2ZSB0d28gYXJndW1lbnRzIG9uZSBmb3IgYSB2ZWN0b3IgYW5kIHRoZSBvdGhlciBmb3IgYSBzY2FsYXIuIAoKYi4gVGhlbiwgZ2VuZXJhdGUgYSByYW5kb20gdmVjdG9yIG9mIDEwMCBpbnRlZ2VycyAoaW4gYSByYW5nZSAxLTIwKSB1c2UgdGhlIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIG51bWJlciAxMiBpcyBpbiB0aGF0IHZlY3Rvci4gCgojIyBQYXJ0IDIKCldyaXRlIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBpbiBhIGRhdGEuZnJhbWUgYXMgYW4gaW5wdXQsIHByaW50cyBvdXQgdGhlIGNvbHVtbiBuYW1lcywgYW5kIHJldHVybnMgaXRzIGRpbWVuc2lvbnMuCgojIEV4ZXJjaXNlIDY6IEFwcGx5IGZhbWlseSBmdW5jdGlvbnMKCiMjIFBhcnQgMQpCZWxvdyB3ZSBwcmludCBzaXggZmlyc3Qgcm93cyBvZiB0aGUgYnVpbHQtaW4gZGF0YXNldCwgYG10Y2Fyc2AsIGZyb20gdGhlIDE5NzQgTW90b3IgVHJlbmQgVVMgbWFnYXppbmUsIHdoaWNoIGNvbXByaXNlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZnVlbCBjb25zdW1wdGlvbiBhbmQgMTAgYXNwZWN0cyBvZiBhdXRvbW9iaWxlIGRlc2lnbiBhbmQgcGVyZm9ybWFuY2UgZm9yIDMyIHNlbGVjdGVkIGNhciBtb2RlbHMuIAoKYGBge3J9CmhlYWQobXRjYXJzKQpgYGAKClVzZSBgYXBwbHkoKWAgZnVuY3Rpb24gdG8gZmluZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGFuZCB0aGUgMC44LXF1YW50aWxlIG9mIGVhY2ggb2YgdGhlIGF1dG9tb2JpbGUgY2hhcmFjdGVyaXN0aWMuCgojIyBQYXJ0IDIKCkJlbG93IGlzIGEgdmVjdG9yIG9mIGRhdGVzIGluIHllYXIgMjAxOC4gSGludDogeW91IG1pZ2h0IGZpbmQgdGhlIGBjZWlsaW5nYCBmdW5jdGlvbiB1c2VmdWwuCgpgYGB7cn0Kc2V0LnNlZWQoMTIzNCkKeTIwMTggPC0gc2VxKGFzLkRhdGUoIjIwMTgtMDEtMDEiLCBmb3JtYXQgPSAiJVktJW0tJWQiKSwgCiAgICAgICAgICAgICBhcy5EYXRlKCIyMDE4LTEyLTMxIiwgZm9ybWF0ID0gIiVZLSVtLSVkIiksIAogICAgICAgICAgICAgImRheXMiKQpsZW5ndGgoeTIwMTgpCiMgQSByYW5kb20gc2FtcGxlIG9mIDEwIGRhdGVzIGZyb20gMjAxOAp5MjAxOF9zYW1wbGUgPC0gc2FtcGxlKHkyMDE4LCBzaXplID0gMTApCnkyMDE4X3NhbXBsZQpgYGAKClVzZSBhbiBgYXBwbHlgIGZhbWlseSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG51bWJlciBvZiB3ZWVrcyBsZWZ0IGZyb20gZWFjaCBkYXkgaW4gYHkyMDE4X3NhbXBsZWAgdG8gdGhlIE5ldyBZZWFyLCAyMDE5LzAxLzAxLgoKTm90ZTogeW91IGNhbiBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBEYXRlIG9iamVjdHMuCgpgYGB7cn0KYXMuRGF0ZSgiMjAxOS0wMS0wMSIsIGZvcm1hdCA9ICIlWS0lbS0lZCIpIC0gYXMuRGF0ZSgiMjAxOC0wMS0wMSIsIGZvcm1hdCA9ICIlWS0lbS0lZCIpCmBgYAoKCg==