2.6 Vectorized Operations

2.6.1 Vector In, Vector Out

u <- c(5,2,8)
v <- c(1,3,9)
u>v
[1]  TRUE FALSE FALSE

Below create two vectors y and z and compare them.

#Enter your answer here

Above, the > function was applied to u[1] and v[1], resulting in TRUE, then to u[2] and v[2], resulting in FALSE, and so on.

A key point is that if an R function uses vectorized operations, it, too, is vectorized, thus enabling a potential speedup. Here is an example:

w <- function(x) return(x+1)
w(u)
[1] 6 3 9
w(v)
[1]  2  4 10

Here, w() uses +, which is vectorized, so w() is vectorized as well. As you can see, there is an unlimited number of vectorized functions, as complex ones are built up from simpler ones.

m <- function(x) return(x**2+1)
m(u)
[1] 26  5 65
m(v)
[1]  2 10 82

Now create a functions that returns x^2 -1

#Enter your answer here

Let’s apply the function for rounding to the nearest integer to an example vector y:

y <- c(1.2,3.9,0.4)
z <- round(y)
z
[1] 1 4 0

Let’s apply the function for rounding to the nearest integer to an example vector r<-c(0.25,0.9,2.1,4.7,5.1):

#Enter your answer here

Since we know that R has no scalars, let’s consider vectorized functions that appear to have scalar arguments.

f<-function(x,c) return((x+c)^2)
f(1:3,0)
[1] 1 4 9
f(1:3,1)
[1]  4  9 16

Create a function that returns (x-c)^2 and calculate f(1:3,0) and f(1:3,1)

#Enter your answer here

2.6.2 Vector In, Matrix Out

The vectorized functions we’ve been working with so far have scalar return values. Calling sqrt() on a number gives us a number. If we apply this function to an eight-element vector, we get eight numbers, thus another eightelement vector, as output. But what if our function itself is vector-valued, as z12() is here:

z12 <- function(z) return(c(z,z^2))

Applying z12() to 5, say, gives us the two-element vector (5,25). If we apply this function to an eight-element vector, it produces 16 numbers:

x <- 1:8
z12(x)
 [1]  1  2  3  4  5  6  7  8  1  4  9 16 25 36 49 64

Compute z12(x2) where x2<-1:5. Explain the output.

#Enter your answer here

It might be more natural to have these arranged as an 8-by-2 matrix, which we can do with the matrix function:

matrix(z12(x),ncol=2)
     [,1] [,2]
[1,]    1    1
[2,]    2    4
[3,]    3    9
[4,]    4   16
[5,]    5   25
[6,]    6   36
[7,]    7   49
[8,]    8   64

Create a similar matrix using z12(x2)

#Enter your answer here

2.7 NA and NULL Values

2.7.1 Using NA

In many of R’s statistical functions, we can instruct the function to skip over any missing values, or NAs. Here is an example:

x <- c(88,NA,12,168,13)
x
[1]  88  NA  12 168  13
mean(x)
[1] NA
mean(x,na.rm=T)
[1] 70.25
x <- c(88,NULL,12,168,13)
mean(x)
[1] 70.25

Enter your comments explaining the output obtained in the previous two exercises.

Let us now work with the mode:

x <- c(5,NA,12)
mode(x[1])
[1] "numeric"
mode(x[2])
[1] "numeric"
y <- c("abc","def",NA)
mode(y[2])
[1] "character"
mode(y[3])
[1] "character"
LS0tDQp0aXRsZTogIkxlY3R1cmUgM19hY3Rpdml0eV80Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCioqMi42IFZlY3Rvcml6ZWQgT3BlcmF0aW9ucyoqDQoNCjIuNi4xIFZlY3RvciBJbiwgVmVjdG9yIE91dA0KDQpgYGB7cn0NCnUgPC0gYyg1LDIsOCkNCnYgPC0gYygxLDMsOSkNCnU+dg0KYGBgDQpCZWxvdyBjcmVhdGUgdHdvIHZlY3RvcnMgeSBhbmQgeiBhbmQgY29tcGFyZSB0aGVtLiANCg0KYGBge3J9DQojRW50ZXIgeW91ciBhbnN3ZXIgaGVyZQ0KYGBgDQoNCg0KQWJvdmUsIHRoZSA+IGZ1bmN0aW9uIHdhcyBhcHBsaWVkIHRvIHVbMV0gYW5kIHZbMV0sIHJlc3VsdGluZyBpbiBUUlVFLCB0aGVuIHRvDQp1WzJdIGFuZCB2WzJdLCByZXN1bHRpbmcgaW4gRkFMU0UsIGFuZCBzbyBvbi4NCg0KQSBrZXkgcG9pbnQgaXMgdGhhdCBpZiBhbiBSIGZ1bmN0aW9uIHVzZXMgdmVjdG9yaXplZCBvcGVyYXRpb25zLCBpdCwgdG9vLCBpcw0KdmVjdG9yaXplZCwgdGh1cyBlbmFibGluZyBhIHBvdGVudGlhbCBzcGVlZHVwLiBIZXJlIGlzIGFuIGV4YW1wbGU6DQoNCmBgYHtyfQ0KdyA8LSBmdW5jdGlvbih4KSByZXR1cm4oeCsxKQ0Kdyh1KQ0KYGBgDQoNCmBgYHtyfQ0Kdyh2KQ0KYGBgDQoNCkhlcmUsIHcoKSB1c2VzICssIHdoaWNoIGlzIHZlY3Rvcml6ZWQsIHNvIHcoKSBpcyB2ZWN0b3JpemVkIGFzIHdlbGwuIEFzIHlvdSBjYW4NCnNlZSwgdGhlcmUgaXMgYW4gdW5saW1pdGVkIG51bWJlciBvZiB2ZWN0b3JpemVkIGZ1bmN0aW9ucywgYXMgY29tcGxleCBvbmVzDQphcmUgYnVpbHQgdXAgZnJvbSBzaW1wbGVyIG9uZXMuDQoNCg0KDQpgYGB7cn0NCm0gPC0gZnVuY3Rpb24oeCkgcmV0dXJuKHgqKjIrMSkNCmBgYA0KDQoNCmBgYHtyfQ0KbSh1KQ0KbSh2KQ0KYGBgDQoNCk5vdyBjcmVhdGUgYSBmdW5jdGlvbnMgdGhhdCByZXR1cm5zIHheMiAtMQ0KDQpgYGB7cn0NCiNFbnRlciB5b3VyIGFuc3dlciBoZXJlDQpgYGANCg0KTGV04oCZcyBhcHBseSB0aGUgZnVuY3Rpb24gZm9yIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdG8gYW4gZXhhbXBsZSB2ZWN0b3IgeToNCg0KYGBge3J9DQp5IDwtIGMoMS4yLDMuOSwwLjQpDQp6IDwtIHJvdW5kKHkpDQp6DQpgYGANCg0KTGV04oCZcyBhcHBseSB0aGUgZnVuY3Rpb24gZm9yIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdG8gYW4gZXhhbXBsZSB2ZWN0b3IgcjwtYygwLjI1LDAuOSwyLjEsNC43LDUuMSk6DQoNCmBgYHtyfQ0KI0VudGVyIHlvdXIgYW5zd2VyIGhlcmUNCmBgYA0KDQpTaW5jZSB3ZSBrbm93IHRoYXQgUiBoYXMgbm8gc2NhbGFycywgbGV04oCZcyBjb25zaWRlciB2ZWN0b3JpemVkIGZ1bmN0aW9ucyB0aGF0IGFwcGVhciB0byBoYXZlIHNjYWxhciBhcmd1bWVudHMuDQoNCmBgYHtyfQ0KZjwtZnVuY3Rpb24oeCxjKSByZXR1cm4oKHgrYyleMikNCmYoMTozLDApDQpmKDE6MywxKQ0KYGBgDQoNCkNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAoeC1jKV4yIGFuZCBjYWxjdWxhdGUgZigxOjMsMCkgYW5kIGYoMTozLDEpDQoNCmBgYHtyfQ0KI0VudGVyIHlvdXIgYW5zd2VyIGhlcmUNCmBgYA0KDQoNCg0KKioyLjYuMiBWZWN0b3IgSW4sIE1hdHJpeCBPdXQqKg0KDQpUaGUgdmVjdG9yaXplZCBmdW5jdGlvbnMgd2XigJl2ZSBiZWVuIHdvcmtpbmcgd2l0aCBzbyBmYXIgaGF2ZSBzY2FsYXIgcmV0dXJuIHZhbHVlcy4gQ2FsbGluZyBzcXJ0KCkgb24gYSBudW1iZXIgZ2l2ZXMgdXMgYSBudW1iZXIuIElmIHdlIGFwcGx5IHRoaXMgZnVuY3Rpb24gdG8gYW4gZWlnaHQtZWxlbWVudCB2ZWN0b3IsIHdlIGdldCBlaWdodCBudW1iZXJzLCB0aHVzIGFub3RoZXIgZWlnaHRlbGVtZW50IHZlY3RvciwgYXMgb3V0cHV0LiBCdXQgd2hhdCBpZiBvdXIgZnVuY3Rpb24gaXRzZWxmIGlzIHZlY3Rvci12YWx1ZWQsIGFzIHoxMigpIGlzIGhlcmU6DQoNCmBgYHtyfQ0KejEyIDwtIGZ1bmN0aW9uKHopIHJldHVybihjKHosel4yKSkNCmBgYA0KDQpBcHBseWluZyB6MTIoKSB0byA1LCBzYXksIGdpdmVzIHVzIHRoZSB0d28tZWxlbWVudCB2ZWN0b3IgKDUsMjUpLiBJZiB3ZSBhcHBseSB0aGlzIGZ1bmN0aW9uIHRvIGFuIGVpZ2h0LWVsZW1lbnQgdmVjdG9yLCBpdCBwcm9kdWNlcyAxNiBudW1iZXJzOg0KDQpgYGB7cn0NCnggPC0gMTo4DQp6MTIoeCkNCmBgYA0KQ29tcHV0ZSB6MTIoeDIpIHdoZXJlIHgyPC0xOjUuIEV4cGxhaW4gdGhlIG91dHB1dC4gDQoNCmBgYHtyfQ0KI0VudGVyIHlvdXIgYW5zd2VyIGhlcmUNCmBgYA0KDQoNCkl0IG1pZ2h0IGJlIG1vcmUgbmF0dXJhbCB0byBoYXZlIHRoZXNlIGFycmFuZ2VkIGFzIGFuIDgtYnktMiBtYXRyaXgsIHdoaWNoIHdlIGNhbiBkbyB3aXRoIHRoZSBtYXRyaXggZnVuY3Rpb246DQoNCmBgYHtyfQ0KbWF0cml4KHoxMih4KSxuY29sPTIpDQpgYGANCkNyZWF0ZSBhIHNpbWlsYXIgbWF0cml4IHVzaW5nIHoxMih4MikNCg0KYGBge3J9DQojRW50ZXIgeW91ciBhbnN3ZXIgaGVyZQ0KYGBgDQoNCioqMi43IE5BIGFuZCBOVUxMIFZhbHVlcyoqDQoNCjIuNy4xIFVzaW5nIE5BDQoNCkluIG1hbnkgb2YgUuKAmXMgc3RhdGlzdGljYWwgZnVuY3Rpb25zLCB3ZSBjYW4gaW5zdHJ1Y3QgdGhlIGZ1bmN0aW9uIHRvIHNraXAgb3ZlciBhbnkgbWlzc2luZyB2YWx1ZXMsIG9yIE5Bcy4gSGVyZSBpcyBhbiBleGFtcGxlOg0KDQpgYGB7cn0NCnggPC0gYyg4OCxOQSwxMiwxNjgsMTMpDQp4DQpgYGANCg0KYGBge3J9DQptZWFuKHgpDQpgYGANCg0KYGBge3J9DQptZWFuKHgsbmEucm09VCkNCmBgYA0KDQpgYGB7cn0NCnggPC0gYyg4OCxOVUxMLDEyLDE2OCwxMykNCm1lYW4oeCkNCmBgYA0KDQpFbnRlciB5b3VyIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIG91dHB1dCBvYnRhaW5lZCBpbiB0aGUgcHJldmlvdXMgdHdvIGV4ZXJjaXNlcy4gDQoNCkxldCB1cyBub3cgd29yayB3aXRoIHRoZSBtb2RlOg0KDQpgYGB7cn0NCnggPC0gYyg1LE5BLDEyKQ0KbW9kZSh4WzFdKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZSh4WzJdKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnkgPC0gYygiYWJjIiwiZGVmIixOQSkNCmBgYA0KDQoNCg0KYGBge3J9DQptb2RlKHlbMl0pDQptb2RlKHlbM10pDQpgYGANCg0K