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 -
[[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