lapply

Applies a function over list or vector and retuns a list by default.

Example 1

Here is a sample list -

> sample_list <- list(id = 18204004,
+                     cities = c("Dhaka", "Chittagong", "Sylhet"),
+                     logic = TRUE)

If we want to know the class of each of the elements of the list we can use -

> for(i in sample_list){
+   print(class(i))
+ }
[1] "numeric"
[1] "character"
[1] "logical"

But, lapply does the work easily -

> lapply(sample_list, class)
$id
[1] "numeric"

$cities
[1] "character"

$logic
[1] "logical"

Example 2

Let’s say we have a vector of cities in Bangladesh -

> cities <- c("Dhaka", "Chittagong", "Sylhet", "Mymensingh")

Length of the characters of the cities -

> len <- numeric()
> for (i in 1:length(cities)){
+   len[i] <- nchar(cities[i])
+ }
> len
[1]  5 10  6 10

This could also be done using lapply -

> lapply(cities, nchar)
[[1]]
[1] 5

[[2]]
[1] 10

[[3]]
[1] 6

[[4]]
[1] 10

This returns a list of character lengths. We can get a vector using unlist -

> unlist(lapply(cities, nchar))
[1]  5 10  6 10

simplify2array function does the same work -

> simplify2array(lapply(cities, nchar))
[1]  5 10  6 10

sapply

Stands for simplifies apply. The sapply() function works like lapply(), but it tries to simplify the output to the most elementary data structure that is possible, usually a vector.

Example 1

> cities <- c("Dhaka", "Chittagong", "Sylhet", "Mymensingh")
> sapply(cities, nchar)
     Dhaka Chittagong     Sylhet Mymensingh 
         5         10          6         10 

We can choose not to name the output of sapply by setting the USE.NAMES argument to FALSE -

> sapply(cities, nchar, USE.NAMES = FALSE)
[1]  5 10  6 10

Using sapply we can also get list as an output by setting simplify argument to FALSE -

> sapply(cities, nchar, simplify = FALSE)
$Dhaka
[1] 5

$Chittagong
[1] 10

$Sylhet
[1] 6

$Mymensingh
[1] 10

Example 2

In case of multiple function outputs sapply may return a matrix -

> set.seed(0)
> sapply(list(`Sample 1` = runif(10), 
+             `Sample 2` = runif(10)), 
+        function(x) c(minimum = min(x), 
+                      average = mean(x), 
+                      maximum = max(x)))
         Sample 1   Sample 2
minimum 0.2016819 0.06178627
average 0.6350050 0.48725446
maximum 0.9446753 0.99190609

vapply

While using vapply we have to specifically denote how many outputs are going to be there by the function or the length of the output -

> set.seed(0)
> basics <- function(x) {
+   c(minimum = min(x), 
+     average = mean(x), 
+     maximum = max(x))
+ }
> vapply(list(`Sample 1` = runif(10), 
+             `Sample 2` = runif(10)),
+        basics, 
+        FUN.VALUE = numeric(3))
         Sample 1   Sample 2
minimum 0.2016819 0.06178627
average 0.6350050 0.48725446
maximum 0.9446753 0.99190609

Similary for logical output of length 1 we have to specify it -

> set.seed(0)
> numbers <- sample(10)
> vapply(numbers, 
+        function(x) ifelse(x > 5, TRUE, FALSE), 
+        FUN.VALUE = logical(1))
 [1]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE

Five number summary of a data frame:

> vapply(as.list.data.frame(mtcars), # df converted to list where all are numeric
+        FUN = fivenum, 
+        FUN.VALUE = c(Min. = numeric(1), "1st Qu." = numeric(1),
+                      Median = numeric(1), "3rd Qu." = numeric(1),
+                      Max. = numeric(1)))
          mpg cyl   disp  hp  drat     wt   qsec vs am gear carb
Min.    10.40   4  71.10  52 2.760 1.5130 14.500  0  0    3    1
1st Qu. 15.35   4 120.65  96 3.080 2.5425 16.885  0  0    3    2
Median  19.20   6 196.30 123 3.695 3.3250 17.710  0  0    4    2
3rd Qu. 22.80   8 334.00 180 3.920 3.6500 18.900  1  1    4    4
Max.    33.90   8 472.00 335 4.930 5.4240 22.900  1  1    5    8
LS0tDQp0aXRsZTogIkFwcGx5IEZ1bmN0aW9ucyINCmF1dGhvcjogJ01EIEFIU0FOVUwgSVNMQU0nDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgY29tbWVudCA9ICIiLCBwcm9tcHQgPSBUUlVFLCBtZXNzYWdlPUYsIHdhcm5pbmcgPSBGDQopDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgbGFwcGx5DQoNCkFwcGxpZXMgYSBmdW5jdGlvbiBvdmVyIGxpc3Qgb3IgdmVjdG9yIGFuZCByZXR1bnMgYSBsaXN0IGJ5IGRlZmF1bHQuDQoNCiMjIEV4YW1wbGUgMQ0KDQpIZXJlIGlzIGEgc2FtcGxlIGxpc3QgLQ0KDQpgYGB7cn0NCnNhbXBsZV9saXN0IDwtIGxpc3QoaWQgPSAxODIwNDAwNCwNCiAgICAgICAgICAgICAgICAgICAgY2l0aWVzID0gYygiRGhha2EiLCAiQ2hpdHRhZ29uZyIsICJTeWxoZXQiKSwNCiAgICAgICAgICAgICAgICAgICAgbG9naWMgPSBUUlVFKQ0KYGBgDQoNCklmIHdlIHdhbnQgdG8ga25vdyB0aGUgY2xhc3Mgb2YgZWFjaCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3Qgd2UgY2FuIHVzZSAtDQoNCmBgYHtyfQ0KZm9yKGkgaW4gc2FtcGxlX2xpc3Qpew0KICBwcmludChjbGFzcyhpKSkNCn0NCmBgYA0KDQpCdXQsIGBsYXBwbHlgIGRvZXMgdGhlIHdvcmsgZWFzaWx5IC0NCg0KYGBge3J9DQpsYXBwbHkoc2FtcGxlX2xpc3QsIGNsYXNzKQ0KYGBgDQoNCiMjIEV4YW1wbGUgMg0KDQpMZXQncyBzYXkgd2UgaGF2ZSBhIHZlY3RvciBvZiBjaXRpZXMgaW4gQmFuZ2xhZGVzaCAtDQoNCmBgYHtyfQ0KY2l0aWVzIDwtIGMoIkRoYWthIiwgIkNoaXR0YWdvbmciLCAiU3lsaGV0IiwgIk15bWVuc2luZ2giKQ0KYGBgDQoNCkxlbmd0aCBvZiB0aGUgY2hhcmFjdGVycyBvZiB0aGUgY2l0aWVzIC0NCg0KYGBge3J9DQpsZW4gPC0gbnVtZXJpYygpDQpmb3IgKGkgaW4gMTpsZW5ndGgoY2l0aWVzKSl7DQogIGxlbltpXSA8LSBuY2hhcihjaXRpZXNbaV0pDQp9DQpsZW4NCmBgYA0KDQpUaGlzIGNvdWxkIGFsc28gYmUgZG9uZSB1c2luZyBgbGFwcGx5YCAtDQoNCmBgYHtyfQ0KbGFwcGx5KGNpdGllcywgbmNoYXIpDQpgYGANCg0KVGhpcyByZXR1cm5zIGEgbGlzdCBvZiBjaGFyYWN0ZXIgbGVuZ3Rocy4gV2UgY2FuIGdldCBhIHZlY3RvciB1c2luZyBgdW5saXN0YCAtDQoNCmBgYHtyfQ0KdW5saXN0KGxhcHBseShjaXRpZXMsIG5jaGFyKSkNCmBgYA0KDQpgc2ltcGxpZnkyYXJyYXlgIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgd29yayAtDQoNCmBgYHtyfQ0Kc2ltcGxpZnkyYXJyYXkobGFwcGx5KGNpdGllcywgbmNoYXIpKQ0KYGBgDQoNCiMgc2FwcGx5DQoNClN0YW5kcyBmb3Igc2ltcGxpZmllcyBhcHBseS4gVGhlIHNhcHBseSgpIGZ1bmN0aW9uIHdvcmtzIGxpa2UgbGFwcGx5KCksIGJ1dCBpdCB0cmllcyB0byBzaW1wbGlmeSB0aGUgb3V0cHV0IHRvIHRoZSBtb3N0IGVsZW1lbnRhcnkgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyBwb3NzaWJsZSwgdXN1YWxseSBhIHZlY3Rvci4NCg0KIyMgRXhhbXBsZSAxDQoNCmBgYHtyfQ0KY2l0aWVzIDwtIGMoIkRoYWthIiwgIkNoaXR0YWdvbmciLCAiU3lsaGV0IiwgIk15bWVuc2luZ2giKQ0Kc2FwcGx5KGNpdGllcywgbmNoYXIpDQpgYGANCg0KV2UgY2FuIGNob29zZSBub3QgdG8gbmFtZSB0aGUgb3V0cHV0IG9mIGBzYXBwbHlgIGJ5IHNldHRpbmcgdGhlIFVTRS5OQU1FUyBhcmd1bWVudCB0byBGQUxTRSAtDQoNCmBgYHtyfQ0Kc2FwcGx5KGNpdGllcywgbmNoYXIsIFVTRS5OQU1FUyA9IEZBTFNFKQ0KYGBgDQoNClVzaW5nIHNhcHBseSB3ZSBjYW4gYWxzbyBnZXQgbGlzdCBhcyBhbiBvdXRwdXQgYnkgc2V0dGluZyBzaW1wbGlmeSBhcmd1bWVudCB0byBGQUxTRSAtDQoNCmBgYHtyfQ0Kc2FwcGx5KGNpdGllcywgbmNoYXIsIHNpbXBsaWZ5ID0gRkFMU0UpDQpgYGANCg0KDQojIyBFeGFtcGxlIDINCg0KSW4gY2FzZSBvZiBtdWx0aXBsZSBmdW5jdGlvbiBvdXRwdXRzIHNhcHBseSBtYXkgcmV0dXJuIGEgbWF0cml4IC0NCmBgYHtyfQ0Kc2V0LnNlZWQoMCkNCnNhcHBseShsaXN0KGBTYW1wbGUgMWAgPSBydW5pZigxMCksIA0KICAgICAgICAgICAgYFNhbXBsZSAyYCA9IHJ1bmlmKDEwKSksIA0KICAgICAgIGZ1bmN0aW9uKHgpIGMobWluaW11bSA9IG1pbih4KSwgDQogICAgICAgICAgICAgICAgICAgICBhdmVyYWdlID0gbWVhbih4KSwgDQogICAgICAgICAgICAgICAgICAgICBtYXhpbXVtID0gbWF4KHgpKSkNCmBgYA0KDQojIHZhcHBseQ0KDQpXaGlsZSB1c2luZyB2YXBwbHkgd2UgaGF2ZSB0byBzcGVjaWZpY2FsbHkgZGVub3RlIGhvdyBtYW55IG91dHB1dHMgYXJlIGdvaW5nIHRvIGJlIHRoZXJlIGJ5IHRoZSBmdW5jdGlvbiBvciB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgLSANCmBgYHtyfQ0Kc2V0LnNlZWQoMCkNCmJhc2ljcyA8LSBmdW5jdGlvbih4KSB7DQogIGMobWluaW11bSA9IG1pbih4KSwgDQogICAgYXZlcmFnZSA9IG1lYW4oeCksIA0KICAgIG1heGltdW0gPSBtYXgoeCkpDQp9DQp2YXBwbHkobGlzdChgU2FtcGxlIDFgID0gcnVuaWYoMTApLCANCiAgICAgICAgICAgIGBTYW1wbGUgMmAgPSBydW5pZigxMCkpLA0KICAgICAgIGJhc2ljcywgDQogICAgICAgRlVOLlZBTFVFID0gbnVtZXJpYygzKSkNCmBgYA0KDQpTaW1pbGFyeSBmb3IgbG9naWNhbCBvdXRwdXQgb2YgbGVuZ3RoIDEgd2UgaGF2ZSB0byBzcGVjaWZ5IGl0IC0NCmBgYHtyfQ0Kc2V0LnNlZWQoMCkNCm51bWJlcnMgPC0gc2FtcGxlKDEwKQ0KdmFwcGx5KG51bWJlcnMsIA0KICAgICAgIGZ1bmN0aW9uKHgpIGlmZWxzZSh4ID4gNSwgVFJVRSwgRkFMU0UpLCANCiAgICAgICBGVU4uVkFMVUUgPSBsb2dpY2FsKDEpKQ0KYGBgDQoNCkZpdmUgbnVtYmVyIHN1bW1hcnkgb2YgYSBkYXRhIGZyYW1lOg0KYGBge3J9DQp2YXBwbHkoYXMubGlzdC5kYXRhLmZyYW1lKG10Y2FycyksICMgZGYgY29udmVydGVkIHRvIGxpc3Qgd2hlcmUgYWxsIGFyZSBudW1lcmljDQogICAgICAgRlVOID0gZml2ZW51bSwgDQogICAgICAgRlVOLlZBTFVFID0gYyhNaW4uID0gbnVtZXJpYygxKSwgIjFzdCBRdS4iID0gbnVtZXJpYygxKSwNCiAgICAgICAgICAgICAgICAgICAgIE1lZGlhbiA9IG51bWVyaWMoMSksICIzcmQgUXUuIiA9IG51bWVyaWMoMSksDQogICAgICAgICAgICAgICAgICAgICBNYXguID0gbnVtZXJpYygxKSkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0K