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