This lesson will illustrate how to use the tidyverse grammar for (1) reducing the length of the dataframe to specific rows using the filter function in the dplyr package, and (2) reducing the width of the dataframe to specific columns using the select function in the dplyr package.

You don’t have to use the dplyr packages to do this, but this package makes it much easier to remember and read. ## Preliminaries Install the dplyr package if you haven’t already done so. If you have already done so, then erase or comment out the following code chunk

# install.packages('dplyr')

Load the dplyr package. You should do this any time you start a new R session. Notice the warning about masking objects from other packages. This means, for instance, that filter is a function in the stats package, as well as the dplyr package. By loading the dplyr package the default filter function will be the one from dplyr, rather than the filter function from the stats package. You can still call the filter function from the stats package by adding the package name before the function and separating it with two colons: stats::filter().

library(dplyr)

Save this file in a folder that contains the jan17Items.csv file. Alternatively, move that file to the folder in which this notebook file is saved on your machine.

Set the working directory to the folder where this notebook file and data are saved. You can do that in one of at least two ways:

  1. You can use the setwd() command, or
  2. You can use the RStudio menu buttons: Session > Set Workding Directory > To Source File Location

Read in the jan17Items data as j17i.

str(j17i)
'data.frame':   8899 obs. of  21 variables:
 $ Time             : chr  "2017-01-26T21:18:00Z" "2017-01-26T20:30:00Z" "2017-01-26T20:30:00Z" "2017-01-26T20:30:00Z" ...
 $ OperationType    : chr  "SALE" "SALE" "SALE" "SALE" ...
 $ BarCode          : chr  "*" "*" "*" "*" ...
 $ CashierName      : chr  "Nicholas Villines" "Carla Knotts" "Carla Knotts" "Carla Knotts" ...
 $ LineItem         : chr  "Glass Mug" "Lamb Chops" "Salmon and Wheat Bran Salad" "Fountain Drink" ...
 $ Department       : chr  "Beverage" "Entrees" "Entrees" "Beverage" ...
 $ Category         : chr  "Glass Bottle" "Lamb Chops" "Salmon and Wheat Bran Salad" "Fountain" ...
 $ CardholderName   : chr  NA NA NA NA ...
 $ RegisterName     : chr  "RT149" "RT151" "RT151" "RT151" ...
 $ StoreNumber      : chr  "AZ23501411" "AZ23501251" "AZ23501305" "AZ23501289" ...
 $ TransactionNumber: chr  "00Z67OS78157" "00XT6G2179417" "00XT6G2179417" "00XT6G2179417" ...
 $ CustomerCode     : chr  "CWM11331L8O" "CXV10742CJW" "CXV10742CJW" "CXV10742CJW" ...
 $ Cost             : num  0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 ...
 $ Price            : num  3.73 13.38 13.9 2.88 4.83 ...
 $ Quantity         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Modifiers        : num  0.01 0.01 0.01 0.01 0.01 2.36 2.36 1.08 1.08 0.01 ...
 $ Subtotal         : num  3.74 13.39 13.91 2.89 4.84 ...
 $ Discounts        : num  3 -0.03 -0.03 -0.03 -0.03 -0.03 -0.03 -0.03 -0.03 3.63 ...
 $ NetTotal         : num  0.74 13.42 13.94 2.92 4.87 ...
 $ Tax              : num  NaN 1.06 1.09 0.23 0.38 1.13 1.13 1.23 1.04 NaN ...
 $ TotalDue         : num  NaN 14.48 15.03 3.15 5.25 ...

Filtering Rows Using the Filter Function from the dplyr Package

You can filter rows of data to observations that meet a certain condition using the filter() function from the dplyr package along with the relational operator that pertains to your situation.

highCost <- filter(j17i, Cost > 11)
dim(highCost)
[1] 14 21

Compare this to the code to filter rows using base R.

highCostBase <- j17i[j17i$Cost > 11,]
dim(highCostBase)
[1] 14 21

Base R requires you to type the name of the dataframe twice. It’s not that big of a deal, but when you start combining multiple preprocessing functions, the tidyverse grammar is easier to read because you don’t have to type out the name of the dataframe as often, and it’s typically less verbose in general.

You can also filter on multiple conditions. For instance, to reduce the observations only to those where cost is greater than 11 AND price is greater than 13 you would do this:

highCostAndPrice <- filter(j17i, Cost > 11 & Price > 13)
dim(highCostAndPrice)
[1]  0 21

If you want to be less exclusive and include observations where cost is greater than 11 OR price is greater than 13 then you can do this:

highCostOrPrice <- filter(j17i, Cost > 11 | Price > 13)
dim(highCostOrPrice)
[1] 3278   21

Selecting Columns Using dplyr’s Select Function

You can reduce the width of a dataframe by selecting only certain columns using the select() function from the dplyr package. Here’s how you would select onl the Cost column:

highCost_Cost <- select(highCost, Cost)
str(highCost_Cost)
'data.frame':   14 obs. of  1 variable:
 $ Cost: num  19 19 189 189 189 ...

Notice that the highCost_Cost object is still a dataframe object. Compare this to the base R approach:

highCost_CostBase <- highCost[,c('Cost')]
str(highCost_CostBase)
 num [1:14] 19 19 189 189 189 ...

Base R is only a little more verbose, but it’s definitely harder to read. It takes more mental power to identify what’s going on compared to the dplyr approach in which the select() function explicitly indicates that you’re selecting certain columns.

To select multiple columns, such as the Cost and Price columns is a straightforward extension of selecting a single column:

highCost_CostPrice <- select(highCost, Cost, Price)
str(highCost_CostPrice)
'data.frame':   14 obs. of  2 variables:
 $ Cost : num  19 19 189 189 189 ...
 $ Price: num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...

Concluding Comments

There are some occasions when the filter and select functions from dplyr are harder than using base R, but you will not encounter those cases in this course.

LS0tDQp0aXRsZTogIlN1YnNldHRpbmcgRGF0YSBVc2luZyBGaWx0ZXIgYW5kIFNlbGVjdCBGdW5jdGlvbnMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KVGhpcyBsZXNzb24gd2lsbCBpbGx1c3RyYXRlIGhvdyB0byB1c2UgdGhlIHRpZHl2ZXJzZSBncmFtbWFyIGZvciAoMSkgcmVkdWNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YWZyYW1lIHRvIHNwZWNpZmljIHJvd3MgdXNpbmcgdGhlIGZpbHRlciBmdW5jdGlvbiBpbiB0aGUgZHBseXIgcGFja2FnZSwgYW5kICgyKSByZWR1Y2luZyB0aGUgd2lkdGggb2YgdGhlIGRhdGFmcmFtZSB0byBzcGVjaWZpYyBjb2x1bW5zIHVzaW5nIHRoZSBzZWxlY3QgZnVuY3Rpb24gaW4gdGhlIGRwbHlyIHBhY2thZ2UuDQoNCllvdSBkb24ndCBoYXZlIHRvIHVzZSB0aGUgZHBseXIgcGFja2FnZXMgdG8gZG8gdGhpcywgYnV0IHRoaXMgcGFja2FnZSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byByZW1lbWJlciBhbmQgcmVhZC4NCiMjIFByZWxpbWluYXJpZXMNCkluc3RhbGwgdGhlIGRwbHlyIHBhY2thZ2UgaWYgeW91IGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRvbmUgc28sIHRoZW4gZXJhc2Ugb3IgY29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBjb2RlIGNodW5rDQpgYGB7cn0NCiMgaW5zdGFsbC5wYWNrYWdlcygnZHBseXInKQ0KYGBgDQpMb2FkIHRoZSBkcGx5ciBwYWNrYWdlLiBZb3Ugc2hvdWxkIGRvIHRoaXMgYW55IHRpbWUgeW91IHN0YXJ0IGEgbmV3IFIgc2Vzc2lvbi4gTm90aWNlIHRoZSB3YXJuaW5nIGFib3V0IG1hc2tpbmcgb2JqZWN0cyBmcm9tIG90aGVyIHBhY2thZ2VzLiBUaGlzIG1lYW5zLCBmb3IgaW5zdGFuY2UsIHRoYXQgYGZpbHRlcmAgaXMgYSBmdW5jdGlvbiBpbiB0aGUgc3RhdHMgcGFja2FnZSwgYXMgd2VsbCBhcyB0aGUgZHBseXIgcGFja2FnZS4gQnkgbG9hZGluZyB0aGUgZHBseXIgcGFja2FnZSB0aGUgZGVmYXVsdCBmaWx0ZXIgZnVuY3Rpb24gd2lsbCBiZSB0aGUgb25lIGZyb20gZHBseXIsIHJhdGhlciB0aGFuIHRoZSBmaWx0ZXIgZnVuY3Rpb24gZnJvbSB0aGUgc3RhdHMgcGFja2FnZS4gWW91IGNhbiBzdGlsbCBjYWxsIHRoZSBmaWx0ZXIgZnVuY3Rpb24gZnJvbSB0aGUgc3RhdHMgcGFja2FnZSBieSBhZGRpbmcgdGhlIHBhY2thZ2UgbmFtZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIGFuZCBzZXBhcmF0aW5nIGl0IHdpdGggdHdvIGNvbG9uczogYHN0YXRzOjpmaWx0ZXIoKWAuDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpgYGANClNhdmUgdGhpcyBmaWxlIGluIGEgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIGphbjE3SXRlbXMuY3N2IGZpbGUuIEFsdGVybmF0aXZlbHksIG1vdmUgdGhhdCBmaWxlIHRvIHRoZSBmb2xkZXIgaW4gd2hpY2ggdGhpcyBub3RlYm9vayBmaWxlIGlzIHNhdmVkIG9uIHlvdXIgbWFjaGluZS4NCg0KU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZm9sZGVyIHdoZXJlIHRoaXMgbm90ZWJvb2sgZmlsZSBhbmQgZGF0YSBhcmUgc2F2ZWQuIFlvdSBjYW4gZG8gdGhhdCBpbiBvbmUgb2YgYXQgbGVhc3QgdHdvIHdheXM6DQoNCjEuIFlvdSBjYW4gdXNlIHRoZSBgc2V0d2QoKWAgY29tbWFuZCwgb3INCjIuIFlvdSBjYW4gdXNlIHRoZSBSU3R1ZGlvIG1lbnUgYnV0dG9uczogU2Vzc2lvbiA+IFNldCBXb3JrZGluZyBEaXJlY3RvcnkgPiBUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbg0KDQpSZWFkIGluIHRoZSBqYW4xN0l0ZW1zIGRhdGEgYXMgajE3aS4NCmBgYHtyfQ0KajE3aSA8LSByZWFkLmNzdignQzovVXNlcnMvZWJlbmUvRGVza3RvcC9Nb2R1bGUgNC9qYW4xN0l0ZW1zLmNzdicpDQpzdHIoajE3aSkNCmoxN2kgPC0gcmVhZC5jc3YoJ2phbjE3SXRlbXMuY3N2JykNCmBgYA0KDQojIyBGaWx0ZXJpbmcgUm93cyBVc2luZyB0aGUgRmlsdGVyIEZ1bmN0aW9uIGZyb20gdGhlIGRwbHlyIFBhY2thZ2UNCllvdSBjYW4gZmlsdGVyIHJvd3Mgb2YgZGF0YSB0byBvYnNlcnZhdGlvbnMgdGhhdCBtZWV0IGEgY2VydGFpbiBjb25kaXRpb24gdXNpbmcgdGhlIGBmaWx0ZXIoKWAgZnVuY3Rpb24gZnJvbSB0aGUgZHBseXIgcGFja2FnZSBhbG9uZyB3aXRoIHRoZSByZWxhdGlvbmFsIG9wZXJhdG9yIHRoYXQgcGVydGFpbnMgdG8geW91ciBzaXR1YXRpb24uDQpgYGB7cn0NCmhpZ2hDb3N0IDwtIGZpbHRlcihqMTdpLCBDb3N0ID4gMTEpDQpkaW0oaGlnaENvc3QpDQpgYGANCg0KQ29tcGFyZSB0aGlzIHRvIHRoZSBjb2RlIHRvIGZpbHRlciByb3dzIHVzaW5nIGJhc2UgUi4NCmBgYHtyfQ0KaGlnaENvc3RCYXNlIDwtIGoxN2lbajE3aSRDb3N0ID4gMTEsXQ0KZGltKGhpZ2hDb3N0QmFzZSkNCmBgYA0KDQpCYXNlIFIgcmVxdWlyZXMgeW91IHRvIHR5cGUgdGhlIG5hbWUgb2YgdGhlIGRhdGFmcmFtZSB0d2ljZS4gSXQncyBub3QgdGhhdCBiaWcgb2YgYSBkZWFsLCBidXQgd2hlbiB5b3Ugc3RhcnQgY29tYmluaW5nIG11bHRpcGxlIHByZXByb2Nlc3NpbmcgZnVuY3Rpb25zLCB0aGUgdGlkeXZlcnNlIGdyYW1tYXIgaXMgZWFzaWVyIHRvIHJlYWQgYmVjYXVzZSB5b3UgZG9uJ3QgaGF2ZSB0byB0eXBlIG91dCB0aGUgbmFtZSBvZiB0aGUgZGF0YWZyYW1lIGFzIG9mdGVuLCBhbmQgaXQncyB0eXBpY2FsbHkgbGVzcyB2ZXJib3NlIGluIGdlbmVyYWwuDQoNCg0KWW91IGNhbiBhbHNvIGZpbHRlciBvbiBtdWx0aXBsZSBjb25kaXRpb25zLiBGb3IgaW5zdGFuY2UsIHRvIHJlZHVjZSB0aGUgb2JzZXJ2YXRpb25zIG9ubHkgdG8gdGhvc2Ugd2hlcmUgY29zdCBpcyBncmVhdGVyIHRoYW4gMTEgKipBTkQqKiBwcmljZSBpcyBncmVhdGVyIHRoYW4gMTMgeW91IHdvdWxkIGRvIHRoaXM6DQpgYGB7cn0NCmhpZ2hDb3N0QW5kUHJpY2UgPC0gZmlsdGVyKGoxN2ksIENvc3QgPiAxMSAmIFByaWNlID4gMTMpDQpkaW0oaGlnaENvc3RBbmRQcmljZSkNCmBgYA0KDQpJZiB5b3Ugd2FudCB0byBiZSBsZXNzIGV4Y2x1c2l2ZSBhbmQgaW5jbHVkZSBvYnNlcnZhdGlvbnMgd2hlcmUgY29zdCBpcyBncmVhdGVyIHRoYW4gMTEgKipPUioqIHByaWNlIGlzIGdyZWF0ZXIgdGhhbiAxMyB0aGVuIHlvdSBjYW4gZG8gdGhpczoNCmBgYHtyfQ0KaGlnaENvc3RPclByaWNlIDwtIGZpbHRlcihqMTdpLCBDb3N0ID4gMTEgfCBQcmljZSA+IDEzKQ0KZGltKGhpZ2hDb3N0T3JQcmljZSkNCmBgYA0KX19fIA0KIyMgU2VsZWN0aW5nIENvbHVtbnMgVXNpbmcgZHBseXIncyBTZWxlY3QgRnVuY3Rpb24NCllvdSBjYW4gcmVkdWNlIHRoZSB3aWR0aCBvZiBhIGRhdGFmcmFtZSBieSBzZWxlY3Rpbmcgb25seSBjZXJ0YWluIGNvbHVtbnMgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVuY3Rpb24gZnJvbSB0aGUgZHBseXIgcGFja2FnZS4gSGVyZSdzIGhvdyB5b3Ugd291bGQgc2VsZWN0IG9ubCB0aGUgQ29zdCBjb2x1bW46DQpgYGB7cn0NCmhpZ2hDb3N0X0Nvc3QgPC0gc2VsZWN0KGhpZ2hDb3N0LCBDb3N0KQ0Kc3RyKGhpZ2hDb3N0X0Nvc3QpDQpgYGANCg0KTm90aWNlIHRoYXQgdGhlIGhpZ2hDb3N0X0Nvc3Qgb2JqZWN0IGlzIHN0aWxsIGEgZGF0YWZyYW1lIG9iamVjdC4gQ29tcGFyZSB0aGlzIHRvIHRoZSBiYXNlIFIgYXBwcm9hY2g6DQpgYGB7cn0NCmhpZ2hDb3N0X0Nvc3RCYXNlIDwtIGhpZ2hDb3N0WyxjKCdDb3N0JyldDQpzdHIoaGlnaENvc3RfQ29zdEJhc2UpDQpgYGANCg0KQmFzZSBSIGlzIG9ubHkgYSBsaXR0bGUgbW9yZSB2ZXJib3NlLCBidXQgaXQncyBkZWZpbml0ZWx5IGhhcmRlciB0byByZWFkLiBJdCB0YWtlcyBtb3JlIG1lbnRhbCBwb3dlciB0byBpZGVudGlmeSB3aGF0J3MgZ29pbmcgb24gY29tcGFyZWQgdG8gdGhlIGRwbHlyIGFwcHJvYWNoIGluIHdoaWNoIHRoZSBgc2VsZWN0KClgIGZ1bmN0aW9uIGV4cGxpY2l0bHkgaW5kaWNhdGVzIHRoYXQgeW91J3JlIHNlbGVjdGluZyBjZXJ0YWluIGNvbHVtbnMuDQoNClRvIHNlbGVjdCBtdWx0aXBsZSBjb2x1bW5zLCBzdWNoIGFzIHRoZSBDb3N0IGFuZCBQcmljZSBjb2x1bW5zIGlzIGEgc3RyYWlnaHRmb3J3YXJkIGV4dGVuc2lvbiBvZiBzZWxlY3RpbmcgYSBzaW5nbGUgY29sdW1uOg0KYGBge3J9DQpoaWdoQ29zdF9Db3N0UHJpY2UgPC0gc2VsZWN0KGhpZ2hDb3N0LCBDb3N0LCBQcmljZSkNCnN0cihoaWdoQ29zdF9Db3N0UHJpY2UpDQpgYGANCg0KIyMjIENvbmNsdWRpbmcgQ29tbWVudHMgDQpUaGVyZSBhcmUgc29tZSBvY2Nhc2lvbnMgd2hlbiB0aGUgZmlsdGVyIGFuZCBzZWxlY3QgZnVuY3Rpb25zIGZyb20gZHBseXIgYXJlIGhhcmRlciB0aGFuIHVzaW5nIGJhc2UgUiwgYnV0IHlvdSB3aWxsIG5vdCBlbmNvdW50ZXIgdGhvc2UgY2FzZXMgaW4gdGhpcyBjb3Vyc2UuDQo=