{"id":190460,"date":"2023-05-17T10:17:12","date_gmt":"2023-05-17T14:17:12","guid":{"rendered":"https:\/\/ibkrcampus.com\/?p=190460"},"modified":"2023-05-17T15:06:04","modified_gmt":"2023-05-17T19:06:04","slug":"speed-test-sapply-vs-vectorization","status":"publish","type":"post","link":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/","title":{"rendered":"Speed Test: Sapply vs. Vectorization"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The\u00a0<strong>apply<\/strong>\u00a0functions in\u00a0<a href=\"https:\/\/theautomatic.net\/2019\/03\/13\/speed-test-sapply-vs-vectorization\/\">R<\/a>\u00a0are awesome (<a href=\"https:\/\/theautomatic.net\/2018\/11\/13\/those-other-apply-functions\/\">see this post for some lesser known apply functions<\/a>). However, if you can use pure vectorization, then you\u2019ll probably end up making your code run a lot faster than just depending upon functions like\u00a0<em>sapply<\/em>\u00a0and\u00a0<em>lapply<\/em>. This is because apply functions like these still rely on looping through elements in a vector or list behind the scenes \u2013\u00a0<em>one at a time<\/em>.\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Array_programming\">Vectorization<\/a>, on the other hand, allows parallel operations under the hood \u2013 allowing much faster computation. This post runs through a couple such examples involving string substitution and fuzzy matching.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-string-substitution\"><strong>String substitution<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For example, let\u2019s create a vector that looks like this:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>test1, test2, test3, test4, \u2026, test1000000<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">with one million elements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With&nbsp;<em>sapply<\/em>, the code to create this would look like:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">start &lt;- proc.time()\nsamples &lt;- sapply(1:1000000, function(num) paste0(\"test\", num))\nend &lt;- proc.time()\nprint(end - start)<\/pre>\n\n\n\n<figure class=\"wp-block-image img-twothird\"><img decoding=\"async\" width=\"228\" height=\"46\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/05\/vectorization-paste-in-r-theautomatic-net.jpg\" alt=\"\" class=\"wp-image-190465 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 228px; aspect-ratio: 228\/46;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As we can see, this takes over 4 1\/2 seconds. However, if we generate the same vector using vectorization, we can get the job done in only 0.75 seconds!<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">start &lt;- proc.time()\nsamples &lt;- paste0(\"test\", 1:1000000)\nend &lt;- proc.time()\nprint(end - start)<\/pre>\n\n\n\n<figure class=\"wp-block-image img-twothird\"><img decoding=\"async\" width=\"242\" height=\"49\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/05\/sapply-paste-time-theautomatic-net.jpg\" alt=\"\" class=\"wp-image-190466 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 242px; aspect-ratio: 242\/49;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now, we can also use&nbsp;<strong>gsub<\/strong>&nbsp;to remove the substring&nbsp;<em>test<\/em>&nbsp;from every element in the vector,&nbsp;<em>samples<\/em>&nbsp;\u2014 also with vectorization:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">start &lt;- proc.time()\nnums &lt;- gsub(\"test\", \"\", samples)\nend &lt;-  proc.time()\nprint(end - start)<\/pre>\n\n\n\n<figure class=\"wp-block-image img-twothird\"><img decoding=\"async\" width=\"230\" height=\"50\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/05\/vectorize-gsub-in-r-theautomatic-net.jpg\" alt=\"\" class=\"wp-image-190470 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 230px; aspect-ratio: 230\/50;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This takes just over one second. In comparison, using&nbsp;<em>sapply<\/em>&nbsp;takes roughly&nbsp;<strong>eleven times longer!<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">start &lt;- proc.time()\nnums &lt;- sapply(samples, function(string) gsub(\"test\", \"\", string))\nend &lt;-  proc.time()\nprint(end - start)<\/pre>\n\n\n\n<figure class=\"wp-block-image img-twothird\"><img decoding=\"async\" width=\"231\" height=\"52\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/05\/gsub-sapply-in-r-theautomatic-net.jpg\" alt=\"\" class=\"wp-image-190472 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 231px; aspect-ratio: 231\/52;\"><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Fuzzy matching<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vectorization can also be used to vastly speed up fuzzy matching (<a href=\"https:\/\/theautomatic.net\/2017\/12\/11\/vectorize-fuzzy-matching\/\">as described in this post<\/a>). For example, let\u2019s use the&nbsp;<strong>stringi<\/strong>&nbsp;package to randomly generate one million strings. We\u2019ll then use the&nbsp;<strong>stringdist<\/strong>&nbsp;package to compare the word \u201cprogramming\u201d to each random string.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">library(stringi)\nlibrary(stringdist)\n \nset.seed(1)\nrandom_strings &lt;- stri_rand_strings(1000000, nchar(\"programming\"),\"[a-z]\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now, let\u2019s try using&nbsp;<em>sapply<\/em>&nbsp;to calculate a string similarity score (using default parameters) between \u201cprogramming\u201d and each of the one million strings.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">start &lt;- proc.time()\nresults &lt;- sapply(random_strings, function(string) stringsim(\"programming\", string))\nend &lt;- proc.time()\n \nprint(end - start)<\/pre>\n\n\n\n<figure class=\"wp-block-image img-twothird\"><img decoding=\"async\" width=\"249\" height=\"48\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/05\/fuzzy-matching-vectorization-theautomatic-net.jpg\" alt=\"\" class=\"wp-image-190474 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 249px; aspect-ratio: 249\/48;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As we can see, this takes quite a while in computational terms \u2013 over 193 seconds. However, we can vastly speed this up using vectorization, rather than&nbsp;<em>sapply<\/em>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">start &lt;- proc.time()\nresults &lt;- stringsim(\"programming\", random_strings)\nend &lt;- proc.time()\n \nprint(end - start)<\/pre>\n\n\n\n<figure class=\"wp-block-image img-twothird\"><img decoding=\"async\" width=\"234\" height=\"43\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/05\/vectorize-stringdist-in-r-theautomatic-net.jpg\" alt=\"\" class=\"wp-image-190477 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 234px; aspect-ratio: 234\/43;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Above, we\u2019re able to calculate the same similarity scores in\u2026under one second! This is vastly better than the first approach and is made possible due to the parallel operations vectorization performs under the hood. To see the randomly generated word with the maximum similarity score to \u201cprogramming\u201d, we can just run the below line of code:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">names(which.max(results))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This returns the string \u201cwrrgrrmmrnb\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s it for this post!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally posted on <a href=\"https:\/\/theautomatic.net\/2019\/03\/13\/speed-test-sapply-vs-vectorization\/\">TheAutomatic.net<\/a>. <\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post runs through a couple such examples involving string substitution and fuzzy matching.<\/p>\n","protected":false},"author":388,"featured_media":181803,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[339,343,338,342],"tags":[14805,487,6591,15306,15302,15305,15304,15303],"contributors-categories":[13695],"class_list":["post-190460","post","type-post","status-publish","format-standard","has-post-thumbnail","category-data-science","category-programing-languages","category-ibkr-quant-news","category-r-development","tag-fuzzy-matching","tag-r","tag-rstats","tag-sapply","tag-string-substitution","tag-stringdist","tag-stringi","tag-vectorization","contributors-categories-theautomatic-net"],"pp_statuses_selecting_workflow":false,"pp_workflow_action":"current","pp_status_selection":"publish","acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v28.0) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Speed Test: Sapply vs. Vectorization | IBKR Quant<\/title>\n<meta name=\"description\" content=\"This post runs through a couple such examples involving string substitution and fuzzy matching.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/190460\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Speed Test: Sapply vs. Vectorization | IBKR Campus US\" \/>\n<meta property=\"og:description\" content=\"This post runs through a couple such examples involving string substitution and fuzzy matching.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/\" \/>\n<meta property=\"og:site_name\" content=\"IBKR Campus US\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-17T14:17:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-17T19:06:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"550\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Andrew Treadway\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrew Treadway\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\n\t    \"@context\": \"https:\\\/\\\/schema.org\",\n\t    \"@graph\": [\n\t        {\n\t            \"@type\": \"NewsArticle\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/#article\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/\"\n\t            },\n\t            \"author\": {\n\t                \"name\": \"Andrew Treadway\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/d4018570a16fb867f1c08412fc9c64bc\"\n\t            },\n\t            \"headline\": \"Speed Test: Sapply vs. Vectorization\",\n\t            \"datePublished\": \"2023-05-17T14:17:12+00:00\",\n\t            \"dateModified\": \"2023-05-17T19:06:04+00:00\",\n\t            \"mainEntityOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/\"\n\t            },\n\t            \"wordCount\": 387,\n\t            \"commentCount\": 0,\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/02\\\/R-programing.jpg\",\n\t            \"keywords\": [\n\t                \"Fuzzy Matching\",\n\t                \"R\",\n\t                \"rstats\",\n\t                \"Sapply\",\n\t                \"string substitution\",\n\t                \"stringdist\",\n\t                \"stringi\",\n\t                \"Vectorization\"\n\t            ],\n\t            \"articleSection\": [\n\t                \"Data Science\",\n\t                \"Programming Languages\",\n\t                \"Quant\",\n\t                \"R Development\"\n\t            ],\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"CommentAction\",\n\t                    \"name\": \"Comment\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/#respond\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"WebPage\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/\",\n\t            \"name\": \"Speed Test: Sapply vs. Vectorization | IBKR Campus US\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\"\n\t            },\n\t            \"primaryImageOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/#primaryimage\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/02\\\/R-programing.jpg\",\n\t            \"datePublished\": \"2023-05-17T14:17:12+00:00\",\n\t            \"dateModified\": \"2023-05-17T19:06:04+00:00\",\n\t            \"description\": \"This post runs through a couple such examples involving string substitution and fuzzy matching.\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"ReadAction\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"ImageObject\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/speed-test-sapply-vs-vectorization\\\/#primaryimage\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/02\\\/R-programing.jpg\",\n\t            \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/02\\\/R-programing.jpg\",\n\t            \"width\": 900,\n\t            \"height\": 550,\n\t            \"caption\": \"Sign Constrained Lasso with R code\"\n\t        },\n\t        {\n\t            \"@type\": \"WebSite\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"name\": \"IBKR Campus US\",\n\t            \"description\": \"Financial Education from Interactive Brokers\",\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"SearchAction\",\n\t                    \"target\": {\n\t                        \"@type\": \"EntryPoint\",\n\t                        \"urlTemplate\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/?s={search_term_string}\"\n\t                    },\n\t                    \"query-input\": {\n\t                        \"@type\": \"PropertyValueSpecification\",\n\t                        \"valueRequired\": true,\n\t                        \"valueName\": \"search_term_string\"\n\t                    }\n\t                }\n\t            ],\n\t            \"inLanguage\": \"en-US\"\n\t        },\n\t        {\n\t            \"@type\": \"Organization\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\",\n\t            \"name\": \"Interactive Brokers\",\n\t            \"alternateName\": \"IBKR\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"logo\": {\n\t                \"@type\": \"ImageObject\",\n\t                \"inLanguage\": \"en-US\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\",\n\t                \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"width\": 669,\n\t                \"height\": 669,\n\t                \"caption\": \"Interactive Brokers\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\"\n\t            },\n\t            \"publishingPrinciples\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/about-ibkr-campus\\\/\",\n\t            \"ethicsPolicy\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/cyber-security-notice\\\/\"\n\t        },\n\t        {\n\t            \"@type\": \"Person\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/d4018570a16fb867f1c08412fc9c64bc\",\n\t            \"name\": \"Andrew Treadway\",\n\t            \"description\": \"Andrew Treadway currently works as a Senior Data Scientist, and has experience doing analytics, software automation, and ETL. He completed a master\u2019s degree in computer science \\\/ machine learning, and an undergraduate degree in pure mathematics. Connect with him on LinkedIn: https:\\\/\\\/www.linkedin.com\\\/in\\\/andrew-treadway-a3b19b103\\\/In addition to TheAutomatic.net blog, he also teaches in-person courses on Python and R through my NYC meetup: more details.\",\n\t            \"sameAs\": [\n\t                \"https:\\\/\\\/theautomatic.net\\\/about-me\\\/\"\n\t            ],\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/author\\\/andrewtreadway\\\/\"\n\t        }\n\t    ]\n\t}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Speed Test: Sapply vs. Vectorization | IBKR Quant","description":"This post runs through a couple such examples involving string substitution and fuzzy matching.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/190460\/","og_locale":"en_US","og_type":"article","og_title":"Speed Test: Sapply vs. Vectorization | IBKR Campus US","og_description":"This post runs through a couple such examples involving string substitution and fuzzy matching.","og_url":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/","og_site_name":"IBKR Campus US","article_published_time":"2023-05-17T14:17:12+00:00","article_modified_time":"2023-05-17T19:06:04+00:00","og_image":[{"width":900,"height":550,"url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg","type":"image\/jpeg"}],"author":"Andrew Treadway","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Andrew Treadway","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/#article","isPartOf":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/"},"author":{"name":"Andrew Treadway","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/d4018570a16fb867f1c08412fc9c64bc"},"headline":"Speed Test: Sapply vs. Vectorization","datePublished":"2023-05-17T14:17:12+00:00","dateModified":"2023-05-17T19:06:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/"},"wordCount":387,"commentCount":0,"publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"image":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg","keywords":["Fuzzy Matching","R","rstats","Sapply","string substitution","stringdist","stringi","Vectorization"],"articleSection":["Data Science","Programming Languages","Quant","R Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/","url":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/","name":"Speed Test: Sapply vs. Vectorization | IBKR Campus US","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/#primaryimage"},"image":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg","datePublished":"2023-05-17T14:17:12+00:00","dateModified":"2023-05-17T19:06:04+00:00","description":"This post runs through a couple such examples involving string substitution and fuzzy matching.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/speed-test-sapply-vs-vectorization\/#primaryimage","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg","width":900,"height":550,"caption":"Sign Constrained Lasso with R code"},{"@type":"WebSite","@id":"https:\/\/ibkrcampus.com\/campus\/#website","url":"https:\/\/ibkrcampus.com\/campus\/","name":"IBKR Campus US","description":"Financial Education from Interactive Brokers","publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ibkrcampus.com\/campus\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ibkrcampus.com\/campus\/#organization","name":"Interactive Brokers","alternateName":"IBKR","url":"https:\/\/ibkrcampus.com\/campus\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","width":669,"height":669,"caption":"Interactive Brokers"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/"},"publishingPrinciples":"https:\/\/www.interactivebrokers.com\/campus\/about-ibkr-campus\/","ethicsPolicy":"https:\/\/www.interactivebrokers.com\/campus\/cyber-security-notice\/"},{"@type":"Person","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/d4018570a16fb867f1c08412fc9c64bc","name":"Andrew Treadway","description":"Andrew Treadway currently works as a Senior Data Scientist, and has experience doing analytics, software automation, and ETL. He completed a master\u2019s degree in computer science \/ machine learning, and an undergraduate degree in pure mathematics. Connect with him on LinkedIn: https:\/\/www.linkedin.com\/in\/andrew-treadway-a3b19b103\/In addition to TheAutomatic.net blog, he also teaches in-person courses on Python and R through my NYC meetup: more details.","sameAs":["https:\/\/theautomatic.net\/about-me\/"],"url":"https:\/\/www.interactivebrokers.com\/campus\/author\/andrewtreadway\/"}]}},"jetpack_featured_media_url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2023\/02\/R-programing.jpg","_links":{"self":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/190460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/users\/388"}],"replies":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/comments?post=190460"}],"version-history":[{"count":0,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/190460\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media\/181803"}],"wp:attachment":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media?parent=190460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/categories?post=190460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/tags?post=190460"},{"taxonomy":"contributors-categories","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/contributors-categories?post=190460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}