apply()

Example

Find the standard deviation of all the columns of the following matrix:

x <- matrix(rnorm(1000), nrow = 10)
apply(x, 2, sd)
  [1] 1.0574551 0.7717447 1.0437154 0.9843797 1.0993834 1.5198051 0.8191057 0.7346687 0.6835077 1.5164390 0.6369045 0.9792300 0.8032325 0.8898394 0.9236657 0.7418607 0.9105451
 [18] 1.0740149 0.8092771 0.9279929 1.1505271 0.9522845 0.7254643 0.9828141 1.0821504 1.0683092 0.6922605 1.5017619 1.2189768 0.6460531 0.4215512 0.7797988 0.7388694 0.8690181
 [35] 0.7662417 0.8172876 0.6918427 0.6220692 1.1054212 1.1230671 0.6733296 1.1540842 1.3124087 0.9421996 0.9125193 0.9079820 0.6424030 1.2052440 0.9179644 0.8026181 0.7502838
 [52] 0.9089446 0.9403742 1.6082569 1.1966739 1.1352308 1.0814783 1.1345734 0.8483828 1.2770796 1.1065412 1.1119968 1.0843425 0.7026655 0.7329736 1.0175489 0.6174937 0.7073462
 [69] 1.1500308 1.4334542 0.7743164 0.8956324 0.3802646 1.0172544 1.1349055 0.7591854 0.6013043 1.0698834 0.6847021 0.8505329 0.7048829 1.0225093 1.0387289 0.7204771 1.1740977
 [86] 0.9084741 0.7148343 1.2057111 0.7896047 0.7234495 1.4042738 1.3263790 0.8251858 1.7360185 1.3596697 0.7711228 1.0524321 0.9242510 1.0919286 1.1046641

Example

Find the \(25th\), \(50th\), and \(75th\) quartiles for each row of the following matrix:

x <- matrix(rnorm(1000), nrow = 20)
apply(x, 1, quantile, probs = c(0.25, 0.50, 0.75))
           [,1]        [,2]      [,3]       [,4]        [,5]       [,6]       [,7]       [,8]       [,9]       [,10]       [,11]      [,12]      [,13]       [,14]      [,15]
25% -0.50956891 -0.73055826 -0.346590 -1.1035976 -0.68379271 -0.3882826 -0.7139836 -0.8163108 -0.8211391 -0.55263963 -0.46852665 -0.3960063 -0.8023041 -0.68266656 -0.6670356
50% -0.04824303  0.06091757  0.386422 -0.3630408  0.06606362  0.2536221  0.1435972 -0.1024908  0.1195772 -0.07543771  0.06685461  0.3545063 -0.1849408  0.05692009 -0.1359264
75%  0.72059359  0.66716597  0.917081  0.1539769  0.53521187  0.8683253  0.7728211  0.7162965  0.6725316  0.39609973  0.41352134  0.9419863  0.4828933  0.80785426  0.6536286
          [,16]      [,17]       [,18]      [,19]      [,20]
25% -0.58871120 -0.7955278 -0.49027386 -0.7674122 -0.7799056
50%  0.00984653  0.2083515  0.03020513  0.0591510 -0.1942010
75%  0.65395816  0.7468568  0.61055791  0.6304112  0.4821398

lapply()

Example

Create a function that returns a labeled list for with the following values: mean, standard deviation, median, max, and min.

sum_x <- function(x){
  x_list <- list(mean = mean(x),
                 sd = sd(x),
                 median = median(x),
                 min = min(x),
                 max = max(x))
  return(x_list)
}
sum_x(rnorm(100))
$mean
[1] -0.1479339

$sd
[1] 1.049303

$median
[1] -0.2156662

$min
[1] -2.123947

$max
[1] 2.469173

Example

lists <- lapply(1:10, function(i) {
  means <- rpois(1, 3)
  rnorm(5, means)
})

lapply(lists, sum_x)
[[1]]
[[1]]$mean
[1] 2.162938

[[1]]$sd
[1] 1.219633

[[1]]$median
[1] 2.426503

[[1]]$min
[1] 0.8332205

[[1]]$max
[1] 3.312757


[[2]]
[[2]]$mean
[1] 0.9093906

[[2]]$sd
[1] 0.7450555

[[2]]$median
[1] 1.13675

[[2]]$min
[1] -0.318416

[[2]]$max
[1] 1.532858


[[3]]
[[3]]$mean
[1] 3.332643

[[3]]$sd
[1] 1.296783

[[3]]$median
[1] 2.738274

[[3]]$min
[1] 2.133906

[[3]]$max
[1] 5.419936


[[4]]
[[4]]$mean
[1] 1.286913

[[4]]$sd
[1] 0.3698894

[[4]]$median
[1] 1.392122

[[4]]$min
[1] 0.7116543

[[4]]$max
[1] 1.62513


[[5]]
[[5]]$mean
[1] 5.38859

[[5]]$sd
[1] 0.8310632

[[5]]$median
[1] 4.915923

[[5]]$min
[1] 4.724299

[[5]]$max
[1] 6.633903


[[6]]
[[6]]$mean
[1] 2.383245

[[6]]$sd
[1] 0.8305298

[[6]]$median
[1] 2.6521

[[6]]$min
[1] 1.132455

[[6]]$max
[1] 3.28318


[[7]]
[[7]]$mean
[1] 3.996292

[[7]]$sd
[1] 1.609875

[[7]]$median
[1] 4.602427

[[7]]$min
[1] 1.486127

[[7]]$max
[1] 5.45204


[[8]]
[[8]]$mean
[1] 4.390595

[[8]]$sd
[1] 0.7122707

[[8]]$median
[1] 4.599526

[[8]]$min
[1] 3.409747

[[8]]$max
[1] 5.260071


[[9]]
[[9]]$mean
[1] 2.082174

[[9]]$sd
[1] 0.2777956

[[9]]$median
[1] 2.127708

[[9]]$min
[1] 1.718795

[[9]]$max
[1] 2.449855


[[10]]
[[10]]$mean
[1] 2.502443

[[10]]$sd
[1] 0.7773683

[[10]]$median
[1] 2.811042

[[10]]$min
[1] 1.278841

[[10]]$max
[1] 3.120693

sapply()

Example

Using the vector below, compute the length of each string using sapply and str_length() from tidyverse


fruits <- c("apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew", "kiwi", "lemon")
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.4.0      ✔ purrr   1.0.0 
✔ tibble  3.1.8      ✔ dplyr   1.0.10
✔ tidyr   1.2.1      ✔ stringr 1.5.0 
✔ readr   2.1.3      ✔ forcats 0.5.2 ── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
sapply(fruits, str_length)
     apple     banana     cherry       date elderberry        fig      grape   honeydew       kiwi      lemon 
         5          6          6          4         10          3          5          8          4          5 

Example

Using the list generated below, compute the mean of each element of the list using sapply.

# Generate a list of 10 lists, each containing 5 random numbers
lists <- lapply(1:10, function(i) {
  means <- rpois(1, 3)
  rnorm(5, means)
})
sapply(lists, mean)
 [1] 4.326117 2.457072 2.731370 0.690756 4.431522 2.453062 1.614953 1.845660 5.552337 6.622904

Example

Using the vector below, use the sapply() to find \(\log(x)\) for each value and return a matrix:

numbers <- 4:400
sapply(numbers, log, base = 10, simplify = "matrix")
  [1] 0.6020600 0.6989700 0.7781513 0.8450980 0.9030900 0.9542425 1.0000000 1.0413927 1.0791812 1.1139434 1.1461280 1.1760913 1.2041200 1.2304489 1.2552725 1.2787536 1.3010300
 [18] 1.3222193 1.3424227 1.3617278 1.3802112 1.3979400 1.4149733 1.4313638 1.4471580 1.4623980 1.4771213 1.4913617 1.5051500 1.5185139 1.5314789 1.5440680 1.5563025 1.5682017
 [35] 1.5797836 1.5910646 1.6020600 1.6127839 1.6232493 1.6334685 1.6434527 1.6532125 1.6627578 1.6720979 1.6812412 1.6901961 1.6989700 1.7075702 1.7160033 1.7242759 1.7323938
 [52] 1.7403627 1.7481880 1.7558749 1.7634280 1.7708520 1.7781513 1.7853298 1.7923917 1.7993405 1.8061800 1.8129134 1.8195439 1.8260748 1.8325089 1.8388491 1.8450980 1.8512583
 [69] 1.8573325 1.8633229 1.8692317 1.8750613 1.8808136 1.8864907 1.8920946 1.8976271 1.9030900 1.9084850 1.9138139 1.9190781 1.9242793 1.9294189 1.9344985 1.9395193 1.9444827
 [86] 1.9493900 1.9542425 1.9590414 1.9637878 1.9684829 1.9731279 1.9777236 1.9822712 1.9867717 1.9912261 1.9956352 2.0000000 2.0043214 2.0086002 2.0128372 2.0170333 2.0211893
[103] 2.0253059 2.0293838 2.0334238 2.0374265 2.0413927 2.0453230 2.0492180 2.0530784 2.0569049 2.0606978 2.0644580 2.0681859 2.0718820 2.0755470 2.0791812 2.0827854 2.0863598
[120] 2.0899051 2.0934217 2.0969100 2.1003705 2.1038037 2.1072100 2.1105897 2.1139434 2.1172713 2.1205739 2.1238516 2.1271048 2.1303338 2.1335389 2.1367206 2.1398791 2.1430148
[137] 2.1461280 2.1492191 2.1522883 2.1553360 2.1583625 2.1613680 2.1643529 2.1673173 2.1702617 2.1731863 2.1760913 2.1789769 2.1818436 2.1846914 2.1875207 2.1903317 2.1931246
[154] 2.1958997 2.1986571 2.2013971 2.2041200 2.2068259 2.2095150 2.2121876 2.2148438 2.2174839 2.2201081 2.2227165 2.2253093 2.2278867 2.2304489 2.2329961 2.2355284 2.2380461
[171] 2.2405492 2.2430380 2.2455127 2.2479733 2.2504200 2.2528530 2.2552725 2.2576786 2.2600714 2.2624511 2.2648178 2.2671717 2.2695129 2.2718416 2.2741578 2.2764618 2.2787536
[188] 2.2810334 2.2833012 2.2855573 2.2878017 2.2900346 2.2922561 2.2944662 2.2966652 2.2988531 2.3010300 2.3031961 2.3053514 2.3074960 2.3096302 2.3117539 2.3138672 2.3159703
[205] 2.3180633 2.3201463 2.3222193 2.3242825 2.3263359 2.3283796 2.3304138 2.3324385 2.3344538 2.3364597 2.3384565 2.3404441 2.3424227 2.3443923 2.3463530 2.3483049 2.3502480
[222] 2.3521825 2.3541084 2.3560259 2.3579348 2.3598355 2.3617278 2.3636120 2.3654880 2.3673559 2.3692159 2.3710679 2.3729120 2.3747483 2.3765770 2.3783979 2.3802112 2.3820170
[239] 2.3838154 2.3856063 2.3873898 2.3891661 2.3909351 2.3926970 2.3944517 2.3961993 2.3979400 2.3996737 2.4014005 2.4031205 2.4048337 2.4065402 2.4082400 2.4099331 2.4116197
[256] 2.4132998 2.4149733 2.4166405 2.4183013 2.4199557 2.4216039 2.4232459 2.4248816 2.4265113 2.4281348 2.4297523 2.4313638 2.4329693 2.4345689 2.4361626 2.4377506 2.4393327
[273] 2.4409091 2.4424798 2.4440448 2.4456042 2.4471580 2.4487063 2.4502491 2.4517864 2.4533183 2.4548449 2.4563660 2.4578819 2.4593925 2.4608978 2.4623980 2.4638930 2.4653829
[290] 2.4668676 2.4683473 2.4698220 2.4712917 2.4727564 2.4742163 2.4756712 2.4771213 2.4785665 2.4800069 2.4814426 2.4828736 2.4842998 2.4857214 2.4871384 2.4885507 2.4899585
[307] 2.4913617 2.4927604 2.4941546 2.4955443 2.4969296 2.4983106 2.4996871 2.5010593 2.5024271 2.5037907 2.5051500 2.5065050 2.5078559 2.5092025 2.5105450 2.5118834 2.5132176
[324] 2.5145478 2.5158738 2.5171959 2.5185139 2.5198280 2.5211381 2.5224442 2.5237465 2.5250448 2.5263393 2.5276299 2.5289167 2.5301997 2.5314789 2.5327544 2.5340261 2.5352941
[341] 2.5365584 2.5378191 2.5390761 2.5403295 2.5415792 2.5428254 2.5440680 2.5453071 2.5465427 2.5477747 2.5490033 2.5502284 2.5514500 2.5526682 2.5538830 2.5550944 2.5563025
[358] 2.5575072 2.5587086 2.5599066 2.5611014 2.5622929 2.5634811 2.5646661 2.5658478 2.5670264 2.5682017 2.5693739 2.5705429 2.5717088 2.5728716 2.5740313 2.5751878 2.5763414
[375] 2.5774918 2.5786392 2.5797836 2.5809250 2.5820634 2.5831988 2.5843312 2.5854607 2.5865873 2.5877110 2.5888317 2.5899496 2.5910646 2.5921768 2.5932861 2.5943926 2.5954962
[392] 2.5965971 2.5976952 2.5987905 2.5998831 2.6009729 2.6020600

mapply()

Example

Let x and y be two vectors, shown below, represent the x and y coordinates of a point. Using mapply(), compute the the distance between the points and the origin.

x <- c(2, 3, 4, 5)
y <- c(4, 6, 8, 10)

pyth <- \(x,y){
  sqrt(x^2+y^2)
}

mapply(pyth, x=x, y=y)
[1]  4.472136  6.708204  8.944272 11.180340

tapply()

Example

Using the penguins data set from the palmerpenguins package, compute the average bill_length_mm for each island.


#install.packages("palmerpenguins")
library(palmerpenguins)
names(penguins)
[1] "species"           "island"            "bill_length_mm"    "bill_depth_mm"     "flipper_length_mm" "body_mass_g"       "sex"               "year"             
tapply(penguins$bill_length_mm, 
       penguins$island, mean, na.rm = T)
   Biscoe     Dream Torgersen 
 45.25749  44.16774  38.95098 

Example

The vectors below provide the heights of different trees in the sample. Compute the median for each type of tree.

heights <- c(70, 72, 68, 65, 80, 75, 60, 68, 90, 72)
species <- c("maple", "oak", "pine", "maple", "oak", "pine", "maple", "oak", "pine", "maple")
tapply(heights, species, median)
maple   oak  pine 
 67.5  72.0  75.0 
LS0tCnRpdGxlOiAiQ2xhc3MgNyIKYXV0aG9yOiAiSXNhYWMgUXVpbnRhbmlsbGEgU2FsaW5hcyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCclbS0lZC0lWScpYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQotLS0KCiMjIGBhcHBseSgpYAoKIyMjIEV4YW1wbGUKCkZpbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhbGwgdGhlIGNvbHVtbnMgb2YgdGhlIGZvbGxvd2luZyBtYXRyaXg6CgpgYGB7cn0KeCA8LSBtYXRyaXgocm5vcm0oMTAwMCksIG5yb3cgPSAxMCkKYXBwbHkoeCwgMiwgc2QpCmBgYAoKIyMjIEV4YW1wbGUKCkZpbmQgdGhlICQyNXRoJCwgJDUwdGgkLCBhbmQgJDc1dGgkIHF1YXJ0aWxlcyBmb3IgZWFjaCByb3cgb2YgdGhlIGZvbGxvd2luZyBtYXRyaXg6CgpgYGB7cn0KeCA8LSBtYXRyaXgocm5vcm0oMTAwMCksIG5yb3cgPSAyMCkKYXBwbHkoeCwgMSwgcXVhbnRpbGUsIHByb2JzID0gYygwLjI1LCAwLjUwLCAwLjc1KSkKYGBgCgojIyBgbGFwcGx5KClgCgojIyBFeGFtcGxlCgpDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBsYWJlbGVkIGxpc3QgZm9yIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6IG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgbWVkaWFuLCBtYXgsIGFuZCBtaW4uCgpgYGB7cn0Kc3VtX3ggPC0gZnVuY3Rpb24oeCl7CiAgeF9saXN0IDwtIGxpc3QobWVhbiA9IG1lYW4oeCksCiAgICAgICAgICAgICAgICAgc2QgPSBzZCh4KSwKICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeCksCiAgICAgICAgICAgICAgICAgbWluID0gbWluKHgpLAogICAgICAgICAgICAgICAgIG1heCA9IG1heCh4KSkKICByZXR1cm4oeF9saXN0KQp9CnN1bV94KHJub3JtKDEwMCkpCmBgYAoKIyMgRXhhbXBsZQoKYGBge3J9Cmxpc3RzIDwtIGxhcHBseSgxOjEwLCBmdW5jdGlvbihpKSB7CiAgbWVhbnMgPC0gcnBvaXMoMSwgMykKICBybm9ybSg1LCBtZWFucykKfSkKCmxhcHBseShsaXN0cywgc3VtX3gpCmBgYAoKIyMgYHNhcHBseSgpYAoKIyMgRXhhbXBsZQoKVXNpbmcgdGhlIHZlY3RvciBiZWxvdywgY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIGVhY2ggc3RyaW5nIHVzaW5nIGBzYXBwbHlgIGFuZCBgc3RyX2xlbmd0aCgpYCBmcm9tIGB0aWR5dmVyc2VgCgpgYGB7cn0KCmZydWl0cyA8LSBjKCJhcHBsZSIsICJiYW5hbmEiLCAiY2hlcnJ5IiwgImRhdGUiLCAiZWxkZXJiZXJyeSIsICJmaWciLCAiZ3JhcGUiLCAiaG9uZXlkZXciLCAia2l3aSIsICJsZW1vbiIpCmxpYnJhcnkodGlkeXZlcnNlKQpzYXBwbHkoZnJ1aXRzLCBzdHJfbGVuZ3RoKQpgYGAKCiMjIEV4YW1wbGUKClVzaW5nIHRoZSBsaXN0IGdlbmVyYXRlZCBiZWxvdywgY29tcHV0ZSB0aGUgbWVhbiBvZiBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgdXNpbmcgYHNhcHBseWAuCgpgYGB7cn0KIyBHZW5lcmF0ZSBhIGxpc3Qgb2YgMTAgbGlzdHMsIGVhY2ggY29udGFpbmluZyA1IHJhbmRvbSBudW1iZXJzCmxpc3RzIDwtIGxhcHBseSgxOjEwLCBmdW5jdGlvbihpKSB7CiAgbWVhbnMgPC0gcnBvaXMoMSwgMykKICBybm9ybSg1LCBtZWFucykKfSkKc2FwcGx5KGxpc3RzLCBtZWFuKQpgYGAKCiMjIEV4YW1wbGUKClVzaW5nIHRoZSB2ZWN0b3IgYmVsb3csIHVzZSB0aGUgYHNhcHBseSgpYCB0byBmaW5kICRcbG9nKHgpJCBmb3IgZWFjaCB2YWx1ZSBhbmQgcmV0dXJuIGEgbWF0cml4OgoKYGBge3J9Cm51bWJlcnMgPC0gNDo0MDAKc2FwcGx5KG51bWJlcnMsIGxvZywgYmFzZSA9IDEwLCBzaW1wbGlmeSA9ICJtYXRyaXgiKQpgYGAKCiMjIGBtYXBwbHkoKWAKCiMjIEV4YW1wbGUKCkxldCBgeGAgYW5kIGB5YCBiZSB0d28gdmVjdG9ycywgc2hvd24gYmVsb3csIHJlcHJlc2VudCB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiBhIHBvaW50LiBVc2luZyBgbWFwcGx5KClgLCBjb21wdXRlIHRoZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnRzIGFuZCB0aGUgb3JpZ2luLgoKYGBge3J9CnggPC0gYygyLCAzLCA0LCA1KQp5IDwtIGMoNCwgNiwgOCwgMTApCgpweXRoIDwtIFwoeCx5KXsKICBzcXJ0KHheMit5XjIpCn0KCm1hcHBseShweXRoLCB4PXgsIHk9eSkKYGBgCgojIyBgdGFwcGx5KClgCgojIyBFeGFtcGxlCgpVc2luZyB0aGUgYHBlbmd1aW5zYCBkYXRhIHNldCBmcm9tIHRoZSBgcGFsbWVycGVuZ3VpbnNgIHBhY2thZ2UsIGNvbXB1dGUgdGhlIGF2ZXJhZ2UgYGJpbGxfbGVuZ3RoX21tYCBmb3IgZWFjaCBgaXNsYW5kYC4KCmBgYHtyfQoKI2luc3RhbGwucGFja2FnZXMoInBhbG1lcnBlbmd1aW5zIikKbGlicmFyeShwYWxtZXJwZW5ndWlucykKbmFtZXMocGVuZ3VpbnMpCnRhcHBseShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbSwgCiAgICAgICBwZW5ndWlucyRpc2xhbmQsIG1lYW4sIG5hLnJtID0gVCkKYGBgCgojIyBFeGFtcGxlCgpUaGUgdmVjdG9ycyBiZWxvdyBwcm92aWRlIHRoZSBoZWlnaHRzIG9mIGRpZmZlcmVudCB0cmVlcyBpbiB0aGUgc2FtcGxlLiBDb21wdXRlIHRoZSBtZWRpYW4gZm9yIGVhY2ggdHlwZSBvZiB0cmVlLgoKYGBge3J9CmhlaWdodHMgPC0gYyg3MCwgNzIsIDY4LCA2NSwgODAsIDc1LCA2MCwgNjgsIDkwLCA3MikKc3BlY2llcyA8LSBjKCJtYXBsZSIsICJvYWsiLCAicGluZSIsICJtYXBsZSIsICJvYWsiLCAicGluZSIsICJtYXBsZSIsICJvYWsiLCAicGluZSIsICJtYXBsZSIpCnRhcHBseShoZWlnaHRzLCBzcGVjaWVzLCBtZWRpYW4pCmBgYAo=