To install and load the dplyr package:

install.packages("dplyr")

library(dplyr)
getwd()
[1] "/Users/sauce"
# 1. set WD
setwd("/Users/sauce/desktop")
# 2. make folder
if(!file.exists("./data")){
    dir.create("./data")
}
# 3. make handle
fileURL <- "https://github.com/DataScienceSpecialization/courses/blob/master/03_GettingData/dplyr/chicago.rds?raw=true"
# 4. download data
download.file(fileURL, destfile = "./data/chicago.rds", method = "curl", extra='-L')
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   162    0   162    0     0    475      0 --:--:-- --:--:-- --:--:--   476

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   173  100   173    0     0    364      0 --:--:-- --:--:-- --:--:--  168k

100  127k  100  127k    0     0   168k      0 --:--:-- --:--:-- --:--:--  168k
# 5. read data
chicago <- readRDS("./data/chicago.rds")
Warning in format.POSIXlt(as.POSIXlt(x), ...) :
  unknown timezone 'zone/tz/2017c.1.0/zoneinfo/America/Denver'
dim(chicago)
[1] 6940    8

To view the details of the data set:

str(chicago)
'data.frame':   6940 obs. of  8 variables:
 $ city      : chr  "chic" "chic" "chic" "chic" ...
 $ tmpd      : num  31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...
 $ dptp      : num  31.5 29.9 27.4 28.6 28.9 ...
 $ date      : Date, format: "1987-01-01" "1987-01-02" ...
 $ pm25tmean2: num  NA NA NA NA NA NA NA NA NA NA ...
 $ pm10tmean2: num  34 NA 34.2 47 NA ...
 $ o3tmean2  : num  4.25 3.3 3.33 4.38 4.75 ...
 $ no2tmean2 : num  20 23.2 23.8 30.4 30.3 ...
names(chicago)[1:3]
[1] "city" "tmpd" "dptp"

To work with a relevant subset of the data:

subset <- select(chicago, city:dptp)
head(subset)

To remove just one variable from data frame:

subset2 <- select(chicago, -(city:dptp))
head(subset2)

Keep every variable that ends with a 2:

subset3 <- select(chicago, ends_with("2"))
str(subset3)
'data.frame':   6940 obs. of  4 variables:
 $ pm25tmean2: num  NA NA NA NA NA NA NA NA NA NA ...
 $ pm10tmean2: num  34 NA 34.2 47 NA ...
 $ o3tmean2  : num  4.25 3.3 3.33 4.38 4.75 ...
 $ no2tmean2 : num  20 23.2 23.8 30.4 30.3 ...

Keep every variable that ends starts with a d:

subset <- select(chicago, starts_with("d"))
str(subset)
'data.frame':   6940 obs. of  2 variables:
 $ dptp: num  31.5 29.9 27.4 28.6 28.9 ...
 $ date: Date, format: "1987-01-01" "1987-01-02" ...

The “filter” function is quite powerful. Let’s say we’re only interested in observations from the data where the pm25tmean2 value is greater than 30. The “filter” function will return only the rows where this is true.

chic.f <- filter(chicago, pm25tmean2 > 30)
str(chic.f)
'data.frame':   194 obs. of  8 variables:
 $ city      : chr  "chic" "chic" "chic" "chic" ...
 $ tmpd      : num  23 28 55 59 57 57 75 61 73 78 ...
 $ dptp      : num  21.9 25.8 51.3 53.7 52 56 65.8 59 60.3 67.1 ...
 $ date      : Date, format: "1998-01-17" "1998-01-23" ...
 $ pm25tmean2: num  38.1 34 39.4 35.4 33.3 ...
 $ pm10tmean2: num  32.5 38.7 34 28.5 35 ...
 $ o3tmean2  : num  3.18 1.75 10.79 14.3 20.66 ...
 $ no2tmean2 : num  25.3 29.4 25.3 31.4 26.8 ...
summary(chic.f$pm25tmean2)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  30.05   32.12   35.04   36.63   39.53   61.50 

Furthermore, we can apply multiple filters to the data set. In this case, we want all rows where the pm25mean2 >,30 and the tmpd > 80.

chic.f <- filter(chicago, pm25tmean2 > 30 & tmpd > 80)
select(chic.f, date, tmpd, pm25tmean2)

The arrange function helps us rearrange observations in the data frame. We’ll first arrange the data based on date.

chicago <- arrange(chicago, date)
tail(select(chicago, date, pm25tmean2), 3)

And descending order based on date…

chicago <- arrange(chicago, desc(date))

The rename function helps us rename variables in our data frame.

chicago <- rename(chicago, dewpoint = dptp, pm25 = pm25tmean2)

The “mutate” function helps us create a new variable based on existing variables in the data. For instance, with the Chicago data, one might want to compare the daily temperatures to the mean temp for that day. For this we can create a detrend variable.

chicago <- mutate(chicago, pm25detrend = pm25 - mean(pm25, na.rm = TRUE))
summary(chicago)

We can also define summary statistics using the groupby variable in conjunction with the strata variable.

chicago <- mutate(chicago, year = as.POSIXlt(date)$year + 1900)
years <- group_by(chicago, year)
summarize(years, pm25 = mean(pm25, na.rm = TRUE),
          o3 = max(o3tmean2, na.rm = TRUE),
          no2 = median(no2tmean2, na.rm = TRUE))
Source: local data frame [19 x 4]
Error: unexpected symbol in "Source: local data"

We now have summary stats for each year in the data frame.

Let’s now look at the average levels of ozone and nitrogen oxide within quin-tiles of pm25.

qq <- quantile(chicago$pm25, seq(0, 1, 0.2), na.rm = TRUE)
chicago <- mutate(chicago, pm25.quint = cut(pm25, qq))
quint <- group_by(chicago, pm25.quint)
summarize(quint, o3 = mean(o3tmean2, na.rm = TRUE),
          no2 = mean(no2tmean2, na.rm = TRUE))
Source: local data frame [6 x 3]
Error: unexpected symbol in "Source: local data"

Finally, the %>% operator is used to string together dplyr functions. This is a more intuitive method for making multiple commands. We can look at the previous function and this time use the %>% operator.

LS0tCnRpdGxlOiAiQ2hpY2FnbyBQb2xsdXRpb24gLSBQcmFjdGljZSB3aXRoIHRoZSBEcGx5ciBwYWNrYWdlIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUbyBpbnN0YWxsIGFuZCBsb2FkIHRoZSBkcGx5ciBwYWNrYWdlOgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImRwbHlyIikKCmxpYnJhcnkoZHBseXIpCmBgYAoKYGBge3J9CmdldHdkKCkKYGBgCgoKYGBge3J9CgoKCiMgMS4gc2V0IFdECnNldHdkKCIvVXNlcnMvc2F1Y2UvZGVza3RvcCIpCgojIDIuIG1ha2UgZm9sZGVyCmlmKCFmaWxlLmV4aXN0cygiLi9kYXRhIikpewogICAgZGlyLmNyZWF0ZSgiLi9kYXRhIikKfQoKIyAzLiBtYWtlIGhhbmRsZQpmaWxlVVJMIDwtICJodHRwczovL2dpdGh1Yi5jb20vRGF0YVNjaWVuY2VTcGVjaWFsaXphdGlvbi9jb3Vyc2VzL2Jsb2IvbWFzdGVyLzAzX0dldHRpbmdEYXRhL2RwbHlyL2NoaWNhZ28ucmRzP3Jhdz10cnVlIgoKIyA0LiBkb3dubG9hZCBkYXRhCmRvd25sb2FkLmZpbGUoZmlsZVVSTCwgZGVzdGZpbGUgPSAiLi9kYXRhL2NoaWNhZ28ucmRzIiwgbWV0aG9kID0gImN1cmwiLCBleHRyYT0nLUwnKQoKIyA1LiByZWFkIGRhdGEKY2hpY2FnbyA8LSByZWFkUkRTKCIuL2RhdGEvY2hpY2Fnby5yZHMiKQpgYGAKCgoKYGBge3J9CmRpbShjaGljYWdvKQpgYGAKCgpUbyB2aWV3IHRoZSBkZXRhaWxzIG9mIHRoZSBkYXRhIHNldDoKCmBgYHtyfQpzdHIoY2hpY2FnbykKYGBgCgoKYGBge3J9Cm5hbWVzKGNoaWNhZ28pWzE6M10KYGBgCgoKVG8gd29yayB3aXRoIGEgcmVsZXZhbnQgc3Vic2V0IG9mIHRoZSBkYXRhOgoKYGBge3J9CnN1YnNldCA8LSBzZWxlY3QoY2hpY2FnbywgY2l0eTpkcHRwKQpoZWFkKHN1YnNldCkKYGBgCgoKVG8gcmVtb3ZlIGp1c3Qgb25lIHZhcmlhYmxlIGZyb20gZGF0YSBmcmFtZToKCmBgYHtyfQpzZWxlY3QoY2hpY2FnbywgLShjaXR5OmRwdHApKQpgYGAKCgpLZWVwIGV2ZXJ5IHZhcmlhYmxlIHRoYXQgZW5kcyB3aXRoIGEgMjoKCmBgYHtyfQpzdWJzZXQzIDwtIHNlbGVjdChjaGljYWdvLCBlbmRzX3dpdGgoIjIiKSkKc3RyKHN1YnNldDMpCmBgYAoKCktlZXAgZXZlcnkgdmFyaWFibGUgdGhhdCBlbmRzIHN0YXJ0cyB3aXRoIGEgZDoKCmBgYHtyfQpzdWJzZXQgPC0gc2VsZWN0KGNoaWNhZ28sIHN0YXJ0c193aXRoKCJkIikpCnN0cihzdWJzZXQpCmBgYAoKClRoZSAiZmlsdGVyIiBmdW5jdGlvbiBpcyBxdWl0ZSBwb3dlcmZ1bC4gTGV0J3Mgc2F5IHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBvYnNlcnZhdGlvbnMgZnJvbSB0aGUgZGF0YSB3aGVyZSB0aGUgcG0yNXRtZWFuMiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMzAuIFRoZSAiZmlsdGVyIiBmdW5jdGlvbiB3aWxsIHJldHVybiBvbmx5IHRoZSByb3dzIHdoZXJlIHRoaXMgaXMgdHJ1ZS4gCgpgYGB7cn0KY2hpYy5mIDwtIGZpbHRlcihjaGljYWdvLCBwbTI1dG1lYW4yID4gMzApCnN0cihjaGljLmYpCnN1bW1hcnkoY2hpYy5mJHBtMjV0bWVhbjIpCmBgYAoKRnVydGhlcm1vcmUsIHdlIGNhbiBhcHBseSBtdWx0aXBsZSBmaWx0ZXJzIHRvIHRoZSBkYXRhIHNldC4gSW4gdGhpcyBjYXNlLCB3ZSB3YW50IGFsbCByb3dzIHdoZXJlIHRoZSBwbTI1bWVhbjIgPiwzMCBhbmQgdGhlIHRtcGQgPiA4MC4KCgpgYGB7cn0KY2hpYy5mIDwtIGZpbHRlcihjaGljYWdvLCBwbTI1dG1lYW4yID4gMzAgJiB0bXBkID4gODApCnNlbGVjdChjaGljLmYsIGRhdGUsIHRtcGQsIHBtMjV0bWVhbjIpCmBgYAoKClRoZSBhcnJhbmdlIGZ1bmN0aW9uIGhlbHBzIHVzIHJlYXJyYW5nZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRhdGEgZnJhbWUuIFdlJ2xsIGZpcnN0IGFycmFuZ2UgdGhlIGRhdGEgYmFzZWQgb24gZGF0ZS4KCmBgYHtyfQpjaGljYWdvIDwtIGFycmFuZ2UoY2hpY2FnbywgZGF0ZSkKYGBgCgoKQW5kIGRlc2NlbmRpbmcgb3JkZXIgYmFzZWQgb24gZGF0ZS4uLgoKYGBge3J9CmNoaWNhZ28gPC0gYXJyYW5nZShjaGljYWdvLCBkZXNjKGRhdGUpKQpgYGAKCgpUaGUgcmVuYW1lIGZ1bmN0aW9uIGhlbHBzIHVzIHJlbmFtZSB2YXJpYWJsZXMgaW4gb3VyIGRhdGEgZnJhbWUuCgpgYGB7cn0KY2hpY2FnbyA8LSByZW5hbWUoY2hpY2FnbywgZGV3cG9pbnQgPSBkcHRwLCBwbTI1ID0gcG0yNXRtZWFuMikKYGBgCgpUaGUgIm11dGF0ZSIgZnVuY3Rpb24gaGVscHMgdXMgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGJhc2VkIG9uIGV4aXN0aW5nIHZhcmlhYmxlcyBpbiB0aGUgZGF0YS4gRm9yIGluc3RhbmNlLCB3aXRoIHRoZSBDaGljYWdvIGRhdGEsIG9uZSBtaWdodCB3YW50IHRvIGNvbXBhcmUgdGhlIGRhaWx5IHRlbXBlcmF0dXJlcyB0byB0aGUgbWVhbiB0ZW1wIGZvciB0aGF0IGRheS4gRm9yIHRoaXMgd2UgY2FuIGNyZWF0ZSBhIGRldHJlbmQgdmFyaWFibGUuCgpgYGB7cn0KY2hpY2FnbyA8LSBtdXRhdGUoY2hpY2FnbywgcG0yNWRldHJlbmQgPSBwbTI1IC0gbWVhbihwbTI1LCBuYS5ybSA9IFRSVUUpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGNoaWNhZ28pCmBgYAoKV2UgY2FuIGFsc28gIGRlZmluZSBzdW1tYXJ5IHN0YXRpc3RpY3MgdXNpbmcgdGhlIGdyb3VwYnkgdmFyaWFibGUgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3RyYXRhIHZhcmlhYmxlLgoKCmBgYHtyfQpjaGljYWdvIDwtIG11dGF0ZShjaGljYWdvLCB5ZWFyID0gYXMuUE9TSVhsdChkYXRlKSR5ZWFyICsgMTkwMCkKYGBgCgpgYGB7cn0KeWVhcnMgPC0gZ3JvdXBfYnkoY2hpY2FnbywgeWVhcikKYGBgCgpgYGB7cn0Kc3VtbWFyaXplKHllYXJzLCBwbTI1ID0gbWVhbihwbTI1LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgbzMgPSBtYXgobzN0bWVhbjIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICBubzIgPSBtZWRpYW4obm8ydG1lYW4yLCBuYS5ybSA9IFRSVUUpKQpgYGAKCgpXZSBub3cgaGF2ZSBzdW1tYXJ5IHN0YXRzIGZvciBlYWNoIHllYXIgaW4gdGhlIGRhdGEgZnJhbWUuCgoKTGV0J3Mgbm93IGxvb2sgYXQgdGhlIGF2ZXJhZ2UgbGV2ZWxzIG9mIG96b25lIGFuZCBuaXRyb2dlbiBveGlkZSB3aXRoaW4gcXVpbi10aWxlcyBvZiBwbTI1LgoKYGBge3J9CnFxIDwtIHF1YW50aWxlKGNoaWNhZ28kcG0yNSwgc2VxKDAsIDEsIDAuMiksIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KY2hpY2FnbyA8LSBtdXRhdGUoY2hpY2FnbywgcG0yNS5xdWludCA9IGN1dChwbTI1LCBxcSkpCmBgYAoKYGBge3J9CnF1aW50IDwtIGdyb3VwX2J5KGNoaWNhZ28sIHBtMjUucXVpbnQpCmBgYAoKCmBgYHtyfQpzdW1tYXJpemUocXVpbnQsIG8zID0gbWVhbihvM3RtZWFuMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgIG5vMiA9IG1lYW4obm8ydG1lYW4yLCBuYS5ybSA9IFRSVUUpKQpgYGAKCgpGaW5hbGx5LCB0aGUgJT4lIG9wZXJhdG9yIGlzIHVzZWQgdG8gc3RyaW5nIHRvZ2V0aGVyIGRwbHlyIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIG1vcmUgaW50dWl0aXZlIG1ldGhvZCBmb3IgbWFraW5nIG11bHRpcGxlIGNvbW1hbmRzLiBXZSBjYW4gbG9vayBhdCB0aGUgcHJldmlvdXMgZnVuY3Rpb24gYW5kIHRoaXMgdGltZSB1c2UgdGhlICU+JSBvcGVyYXRvci4KCgpgYGB7cn0KbXV0YXRlKGNoaWNhZ28sIHBtMjUucXVpbnQgPSBjdXQocG0yNSwgcXEpKSAlPiUKICAgICAgZ3JvdXBfYnkocG0yNS5xdWludCkgJT4lCiAgICAgIHN1bW1hcml6ZShvMyA9IG1lYW4obzN0bWVhbjIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICBubzIgPSBtZWFuKG5vMnRtZWFuMiwgbmEucm0gPSBUUlVFKSkKYGBgCgo=