Skip to content

Instantly share code, notes, and snippets.

@PatrickRWright
Created August 24, 2020 11:03
Show Gist options
  • Save PatrickRWright/d30759acb4b11da5c1af4ac625ab4bc1 to your computer and use it in GitHub Desktop.
Save PatrickRWright/d30759acb4b11da5c1af4ac625ab4bc1 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Using the map function with tilde (~) notations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In part inspired by [this](https://towardsdatascience.com/functional-programming-in-r-with-purrr-469e597d0229)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# %>%\n",
"library(magrittr)\n",
"# map\n",
"library(purrr)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Map will apply a given function on each element of the input. The **dot (.)** indicated the object passed through by the pipe. In this case first the complete iris dataset and then a list of three data frames. One for each species in the iris dataset."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<dl>\n",
"\t<dt>$setosa</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>5.006</li><li>3.428</li></ol>\n",
"</dd>\n",
"\t<dt>$versicolor</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>5.936</li><li>2.77</li></ol>\n",
"</dd>\n",
"\t<dt>$virginica</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>6.588</li><li>2.974</li></ol>\n",
"</dd>\n",
"</dl>\n"
],
"text/latex": [
"\\begin{description}\n",
"\\item[\\$setosa] \\begin{enumerate*}\n",
"\\item 5.006\n",
"\\item 3.428\n",
"\\end{enumerate*}\n",
"\n",
"\\item[\\$versicolor] \\begin{enumerate*}\n",
"\\item 5.936\n",
"\\item 2.77\n",
"\\end{enumerate*}\n",
"\n",
"\\item[\\$virginica] \\begin{enumerate*}\n",
"\\item 6.588\n",
"\\item 2.974\n",
"\\end{enumerate*}\n",
"\n",
"\\end{description}\n"
],
"text/markdown": [
"$setosa\n",
": 1. 5.006\n",
"2. 3.428\n",
"\n",
"\n",
"\n",
"$versicolor\n",
": 1. 5.936\n",
"2. 2.77\n",
"\n",
"\n",
"\n",
"$virginica\n",
": 1. 6.588\n",
"2. 2.974\n",
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"$setosa\n",
"[1] 5.006 3.428\n",
"\n",
"$versicolor\n",
"[1] 5.936 2.770\n",
"\n",
"$virginica\n",
"[1] 6.588 2.974\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# split iris into a list by the different species and get the means for Sepal.Length and Sepal.Width\n",
"iris %>%\n",
" split(.$Species) %>%\n",
" map(~ c(mean(.$Sepal.Length),\n",
" mean(.$Sepal.Width)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The **tilde (~)** statement in the **map** call is equivalent to the following individual function and can thus replace the overhead of predefining a function."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"means_sepal_iris <- function(data) {\n",
" return(c(mean(data$Sepal.Length),\n",
" mean(data$Sepal.Width)))\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<dl>\n",
"\t<dt>$setosa</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>5.006</li><li>3.428</li></ol>\n",
"</dd>\n",
"\t<dt>$versicolor</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>5.936</li><li>2.77</li></ol>\n",
"</dd>\n",
"\t<dt>$virginica</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>6.588</li><li>2.974</li></ol>\n",
"</dd>\n",
"</dl>\n"
],
"text/latex": [
"\\begin{description}\n",
"\\item[\\$setosa] \\begin{enumerate*}\n",
"\\item 5.006\n",
"\\item 3.428\n",
"\\end{enumerate*}\n",
"\n",
"\\item[\\$versicolor] \\begin{enumerate*}\n",
"\\item 5.936\n",
"\\item 2.77\n",
"\\end{enumerate*}\n",
"\n",
"\\item[\\$virginica] \\begin{enumerate*}\n",
"\\item 6.588\n",
"\\item 2.974\n",
"\\end{enumerate*}\n",
"\n",
"\\end{description}\n"
],
"text/markdown": [
"$setosa\n",
": 1. 5.006\n",
"2. 3.428\n",
"\n",
"\n",
"\n",
"$versicolor\n",
": 1. 5.936\n",
"2. 2.77\n",
"\n",
"\n",
"\n",
"$virginica\n",
": 1. 6.588\n",
"2. 2.974\n",
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"$setosa\n",
"[1] 5.006 3.428\n",
"\n",
"$versicolor\n",
"[1] 5.936 2.770\n",
"\n",
"$virginica\n",
"[1] 6.588 2.974\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"iris %>%\n",
" split(.$Species) %>%\n",
" map(means_sepal_iris)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<dl>\n",
"\t<dt>$setosa</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>5.006</li><li>3.428</li></ol>\n",
"</dd>\n",
"\t<dt>$versicolor</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>5.936</li><li>2.77</li></ol>\n",
"</dd>\n",
"\t<dt>$virginica</dt>\n",
"\t\t<dd><style>\n",
".list-inline {list-style: none; margin:0; padding: 0}\n",
".list-inline>li {display: inline-block}\n",
".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n",
"</style>\n",
"<ol class=list-inline><li>6.588</li><li>2.974</li></ol>\n",
"</dd>\n",
"</dl>\n"
],
"text/latex": [
"\\begin{description}\n",
"\\item[\\$setosa] \\begin{enumerate*}\n",
"\\item 5.006\n",
"\\item 3.428\n",
"\\end{enumerate*}\n",
"\n",
"\\item[\\$versicolor] \\begin{enumerate*}\n",
"\\item 5.936\n",
"\\item 2.77\n",
"\\end{enumerate*}\n",
"\n",
"\\item[\\$virginica] \\begin{enumerate*}\n",
"\\item 6.588\n",
"\\item 2.974\n",
"\\end{enumerate*}\n",
"\n",
"\\end{description}\n"
],
"text/markdown": [
"$setosa\n",
": 1. 5.006\n",
"2. 3.428\n",
"\n",
"\n",
"\n",
"$versicolor\n",
": 1. 5.936\n",
"2. 2.77\n",
"\n",
"\n",
"\n",
"$virginica\n",
": 1. 6.588\n",
"2. 2.974\n",
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"$setosa\n",
"[1] 5.006 3.428\n",
"\n",
"$versicolor\n",
"[1] 5.936 2.770\n",
"\n",
"$virginica\n",
"[1] 6.588 2.974\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"iris %>%\n",
" split(.$Species) %>%\n",
" map(function(.) { return(c(mean(.$Sepal.Length),\n",
" mean(.$Sepal.Width)))}\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"TRUE"
],
"text/latex": [
"TRUE"
],
"text/markdown": [
"TRUE"
],
"text/plain": [
"[1] TRUE"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"TRUE"
],
"text/latex": [
"TRUE"
],
"text/markdown": [
"TRUE"
],
"text/plain": [
"[1] TRUE"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"TRUE"
],
"text/latex": [
"TRUE"
],
"text/markdown": [
"TRUE"
],
"text/plain": [
"[1] TRUE"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Some sanity checks\n",
"mean(iris$Sepal.Length[which(iris$Species == \"setosa\")]) == 5.006\n",
"mean(iris$Sepal.Length[which(iris$Species == \"versicolor\")]) == 5.936\n",
"mean(iris$Sepal.Width[which(iris$Species == \"virginica\")]) == 2.974"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"R version 3.5.1 (2018-07-02)\n",
"Platform: x86_64-conda_cos6-linux-gnu (64-bit)\n",
"Running under: Debian GNU/Linux 10 (buster)\n",
"\n",
"Matrix products: default\n",
"BLAS/LAPACK: /home/jupyterlab/conda/envs/r/lib/R/lib/libRlapack.so\n",
"\n",
"locale:\n",
" [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 \n",
" [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8 \n",
" [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C \n",
"[10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C \n",
"\n",
"attached base packages:\n",
"[1] stats graphics grDevices utils datasets methods base \n",
"\n",
"other attached packages:\n",
"[1] purrr_0.3.4 magrittr_1.5\n",
"\n",
"loaded via a namespace (and not attached):\n",
" [1] Rcpp_1.0.4.6 digest_0.6.25 crayon_1.3.4 IRdisplay_0.7.0\n",
" [5] repr_1.1.0 jsonlite_1.6.1 evaluate_0.14 pillar_1.4.3 \n",
" [9] rlang_0.4.5 uuid_0.1-4 IRkernel_0.8.12 tools_3.5.1 \n",
"[13] compiler_3.5.1 base64enc_0.1-3 htmltools_0.4.0 pbdZMQ_0.3-3 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sessionInfo()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "conda-env-r-r"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment