Selecting Vector Elements

On ocassion, we will want to select one or more elements from a vector. In this section, we will discuss two methods for doing as such: Indexing and Slicing. Later in this notebook, we will discuss a more advanced method called boolean masking.

Indexing

If we want to select a specific entry from a vector, we can do so by following the name of the vector with [n], where n indicates the position of the element we wish to select. This position is called the element’s index.

Note: Unlike most languages, R uses 1 as the index of the first element in a vector (as opposed to 0).

my_vec <- c(10, 20, 30, 40, 50, 60, 70, 80, 90)

my_vec[1]
[1] 10
my_vec[3]
[1] 30

Putting a negative sign in from of an index returns a copy of the vector with the element at that position removed.

my_vec[-3]
[1] 10 20 40 50 60 70 80 90

Slicing

We can select multiple elements from a vector by replacing the index with a vector of indices.

my_vec[c(3, 4, 8)]
[1] 30 40 80
my_vec[2:6]
[1] 20 30 40 50 60

We can also use negative indexing to drop several from a vector.

my_vec[-(2:6)]
[1] 10 70 80 90

Vector Comparisons

We can use the operators <, >, <=, =>, and == to compare vectors and scalars. As with other vector operations, this comparison is performed elementwise. The comparison will return a boolean (TRUE/FALSE) vector of the same size as the original vector.

v <- c(5, 6, 2, 3, 9, 4, 8, 1)

v < 6
[1]  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE

Conditional Counting

R, like most programming languages, assigns a numerical value of 0 to the boolean value FALSE, and assigns a value of 1 to the boolean value TRUE. This fact allows us to use the sum() function to count the number of elements in a vector that satisfy a certain critera.

sum(v < 6)
[1] 5

Boolean Subsetting

We can select elements of a vector by passing it a seperate boolean vector of the same size. For example, assume that we have a vector v and a boolean vector sel of the same size as v. If we pass sel to v in place of an index, then we will get back only the elements of v that are associated with TRUE values in sel.

w <- c(11, 22, 33, 44, 55)
sel <- c(TRUE, FALSE, TRUE, TRUE, FALSE)
w[sel]
[1] 11 33 44

Boolean Masking

Using a boolean vector might not seem like a particularly convenient way of selecting elements from a vector. However, when combined with a vector comparison, this is an extremely useful tool for selecting elements of a vector that satisfy a certain criteria. This method is called boolean masking.

v <- c(5, 6, 2, 3, 9, 4, 8, 1)
sel <- v < 6
v[sel]
[1] 5 2 3 4 1

The last two lines in the previous cell can be combined into a single line.

v[v < 6]
[1] 5 2 3 4 1
LS0tDQp0aXRsZTogIkFwcGVuZGl4IEEuMyAtIEFkZGl0aW9uYWwgVmVjdG9yIFRvcGljcyINCmF1dGhvcjogIlJvYmJpZSBCZWFuZSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQotLS0NCg0KIyMjICoqU2VsZWN0aW5nIFZlY3RvciBFbGVtZW50cyoqDQoNCk9uIG9jYXNzaW9uLCB3ZSB3aWxsIHdhbnQgdG8gc2VsZWN0IG9uZSBvciBtb3JlIGVsZW1lbnRzIGZyb20gYSB2ZWN0b3IuIEluIHRoaXMgc2VjdGlvbiwgd2Ugd2lsbCBkaXNjdXNzIHR3byBtZXRob2RzIGZvciBkb2luZyBhcyBzdWNoOiBJbmRleGluZyBhbmQgU2xpY2luZy4gTGF0ZXIgaW4gdGhpcyBub3RlYm9vaywgd2Ugd2lsbCBkaXNjdXNzIGEgbW9yZSBhZHZhbmNlZCBtZXRob2QgY2FsbGVkIGJvb2xlYW4gbWFza2luZy4gDQoNCiMjIyMgKipJbmRleGluZyoqDQoNCklmIHdlIHdhbnQgdG8gc2VsZWN0IGEgc3BlY2lmaWMgZW50cnkgZnJvbSBhIHZlY3Rvciwgd2UgY2FuIGRvIHNvIGJ5IGZvbGxvd2luZyB0aGUgbmFtZSBvZiB0aGUgdmVjdG9yIHdpdGggYFtuXWAsIHdoZXJlIGBuYCBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IHdlIHdpc2ggdG8gc2VsZWN0LiBUaGlzIHBvc2l0aW9uIGlzIGNhbGxlZCB0aGUgZWxlbWVudCdzIGBpbmRleGAuIA0KDQpOb3RlOiBVbmxpa2UgbW9zdCBsYW5ndWFnZXMsIFIgdXNlcyAxIGFzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHZlY3RvciAoYXMgb3Bwb3NlZCB0byAwKS4NCg0KYGBge3J9DQpteV92ZWMgPC0gYygxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIDkwKQ0KDQpteV92ZWNbMV0NCmBgYA0KDQpgYGB7cn0NCm15X3ZlY1szXQ0KYGBgDQoNClB1dHRpbmcgYSBuZWdhdGl2ZSBzaWduIGluIGZyb20gb2YgYW4gaW5kZXggcmV0dXJucyBhIGNvcHkgb2YgdGhlIHZlY3RvciB3aXRoIHRoZSBlbGVtZW50IGF0IHRoYXQgcG9zaXRpb24gcmVtb3ZlZC4gDQoNCmBgYHtyfQ0KbXlfdmVjWy0zXQ0KYGBgDQoNCg0KIyMjIyAqKlNsaWNpbmcqKg0KDQpXZSBjYW4gc2VsZWN0IG11bHRpcGxlIGVsZW1lbnRzIGZyb20gYSB2ZWN0b3IgYnkgcmVwbGFjaW5nIHRoZSBpbmRleCB3aXRoIGEgdmVjdG9yIG9mIGluZGljZXMuIA0KDQpgYGB7cn0NCm15X3ZlY1tjKDMsIDQsIDgpXQ0KYGBgDQoNCmBgYHtyfQ0KbXlfdmVjWzI6Nl0NCmBgYA0KDQpXZSBjYW4gYWxzbyB1c2UgbmVnYXRpdmUgaW5kZXhpbmcgdG8gZHJvcCBzZXZlcmFsIGZyb20gYSB2ZWN0b3IuIA0KDQpgYGB7cn0NCm15X3ZlY1stKDI6NildDQpgYGANCg0KDQojIyMgKipWZWN0b3IgQ29tcGFyaXNvbnMqKg0KDQpXZSBjYW4gdXNlIHRoZSBvcGVyYXRvcnMgYDxgLCBgPmAsIGA8PWAsIGA9PmAsIGFuZCBgPT1gIHRvIGNvbXBhcmUgdmVjdG9ycyBhbmQgc2NhbGFycy4gQXMgd2l0aCBvdGhlciB2ZWN0b3Igb3BlcmF0aW9ucywgdGhpcyBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBlbGVtZW50d2lzZS4gVGhlIGNvbXBhcmlzb24gd2lsbCByZXR1cm4gYSBib29sZWFuIChUUlVFL0ZBTFNFKSB2ZWN0b3Igb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgb3JpZ2luYWwgdmVjdG9yLiANCg0KYGBge3J9DQp2IDwtIGMoNSwgNiwgMiwgMywgOSwgNCwgOCwgMSkNCg0KdiA8IDYNCmBgYA0KDQojIyMjICoqQ29uZGl0aW9uYWwgQ291bnRpbmcqKg0KDQpSLCBsaWtlIG1vc3QgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBhc3NpZ25zIGEgbnVtZXJpY2FsIHZhbHVlIG9mIDAgdG8gdGhlIGJvb2xlYW4gdmFsdWUgRkFMU0UsIGFuZCBhc3NpZ25zIGEgdmFsdWUgb2YgMSB0byB0aGUgYm9vbGVhbiB2YWx1ZSBUUlVFLiBUaGlzIGZhY3QgYWxsb3dzIHVzIHRvIHVzZSB0aGUgYHN1bSgpYCBmdW5jdGlvbiB0byBjb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgdmVjdG9yIHRoYXQgc2F0aXNmeSBhIGNlcnRhaW4gY3JpdGVyYS4gDQoNCg0KYGBge3J9DQpzdW0odiA8IDYpDQpgYGANCg0KIyMjIyAqKkJvb2xlYW4gU3Vic2V0dGluZyoqDQoNCldlIGNhbiBzZWxlY3QgZWxlbWVudHMgb2YgYSB2ZWN0b3IgYnkgcGFzc2luZyBpdCBhIHNlcGVyYXRlIGJvb2xlYW4gdmVjdG9yIG9mIHRoZSBzYW1lIHNpemUuIEZvciBleGFtcGxlLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgdmVjdG9yIGB2YCBhbmQgYSBib29sZWFuIHZlY3RvciBgc2VsYCBvZiB0aGUgc2FtZSBzaXplIGFzIGB2YC4gSWYgd2UgcGFzcyBgc2VsYCB0byBgdmAgaW4gcGxhY2Ugb2YgYW4gaW5kZXgsIHRoZW4gd2Ugd2lsbCBnZXQgYmFjayBvbmx5IHRoZSBlbGVtZW50cyBvZiBgdmAgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGBUUlVFYCB2YWx1ZXMgaW4gYHNlbGAuIA0KDQpgYGB7cn0NCncgPC0gYygxMSwgMjIsIDMzLCA0NCwgNTUpDQpzZWwgPC0gYyhUUlVFLCBGQUxTRSwgVFJVRSwgVFJVRSwgRkFMU0UpDQp3W3NlbF0NCmBgYA0KDQojIyMjICoqQm9vbGVhbiBNYXNraW5nKioNCg0KVXNpbmcgYSBib29sZWFuIHZlY3RvciBtaWdodCBub3Qgc2VlbSBsaWtlIGEgcGFydGljdWxhcmx5IGNvbnZlbmllbnQgd2F5IG9mIHNlbGVjdGluZyBlbGVtZW50cyBmcm9tIGEgdmVjdG9yLiBIb3dldmVyLCB3aGVuIGNvbWJpbmVkIHdpdGggYSB2ZWN0b3IgY29tcGFyaXNvbiwgdGhpcyBpcyBhbiBleHRyZW1lbHkgdXNlZnVsIHRvb2wgZm9yIHNlbGVjdGluZyBlbGVtZW50cyBvZiBhIHZlY3RvciB0aGF0IHNhdGlzZnkgYSBjZXJ0YWluIGNyaXRlcmlhLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKipib29sZWFuIG1hc2tpbmcqKi4gDQoNCmBgYHtyfQ0KdiA8LSBjKDUsIDYsIDIsIDMsIDksIDQsIDgsIDEpDQpzZWwgPC0gdiA8IDYNCnZbc2VsXQ0KYGBgDQoNClRoZSBsYXN0IHR3byBsaW5lcyBpbiB0aGUgcHJldmlvdXMgY2VsbCBjYW4gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBsaW5lLg0KDQpgYGB7cn0NCnZbdiA8IDZdDQpgYGANCg0KDQoNCg0K