{"id":815,"date":"2015-02-27T14:23:04","date_gmt":"2015-02-27T21:23:04","guid":{"rendered":"http:\/\/homepages.uc.edu\/~yaozo\/wordpress\/?p=815"},"modified":"2015-02-27T14:23:04","modified_gmt":"2015-02-27T21:23:04","slug":"pivot-tables-in-r-with-aggregate","status":"publish","type":"post","link":"https:\/\/zhuoyao.net\/index.php\/2015\/02\/27\/pivot-tables-in-r-with-aggregate\/","title":{"rendered":"Pivot Tables in R with aggregate"},"content":{"rendered":"<header class=\"entry-header\">\n<div class=\"entry-meta\"><span class=\"posted-on\"><i class=\"icon-time\"> <\/i><a href=\"http:\/\/marcoghislanzoni.com\/blog\/2014\/03\/13\/pivot-tables-r-aggregate\/\" rel=\"bookmark\"><time class=\"entry-date published\" title=\"13 Mar 2014\" datetime=\"2014-03-13T19:00:36+00:00\">12 months ago<\/time><\/a><\/span> <span class=\"byline\"><i class=\"icon-user\"> <\/i><span class=\"author vcard\"><a class=\"url fn n\" href=\"http:\/\/marcoghislanzoni.com\/blog\/author\/admin\/\">Marco Ghislanzoni<\/a><\/span><\/span><\/div>\n<\/header>\n<div class=\"entry-content\">\n<div class=\"featured-image-single\"><img loading=\"lazy\" decoding=\"async\" class=\"attachment-post-thumbnail wp-post-image\" src=\"http:\/\/marcoghislanzoni.com\/blog\/wp-content\/uploads\/2013\/10\/Untitled.png\" alt=\"Untitled\" width=\"279\" height=\"289\" \/><\/div>\n<div id=\"yasr_visitor_votes_677\" class=\"yasr-visitor-votes\">\n<div id=\"yasr_rateit_visitor_votes_677\" class=\"rateit\" data-rateit-starwidth=\"16\" data-rateit-starheight=\"16\" data-rateit-value=\"3\" data-rateit-step=\"1\" data-rateit-resetable=\"false\" data-rateit-readonly=\"false\"><\/div>\n<p><span id=\"yasr-total-average-text_677\" class=\"yasr-total-average-text\" title=\"\">[Total: 1 \u00a0 \u00a0Average: 3\/5]<\/span><\/div>\n<p>I noted that a previous post about <a title=\"Pivot Tables in R with melt and cast\" href=\"http:\/\/marcoghislanzoni.com\/blog\/2013\/10\/11\/pivot-tables-in-r-with-melt-and-cast\/\" target=\"_blank\" rel=\"noopener\">Pivot Tables in R with melt and cast<\/a> has gained quite some popularity, so I thought to write on the same topic but using this time a different R function: <em>aggregate<\/em>.\u00a0While <em>aggregate<\/em> is not as powerful as\u00a0<em>melt<\/em> and\u00a0<em>cast<\/em> from the\u00a0<em>reshape<\/em> package, it may result sometimes simpler and more intuitive to use, so it is worth to learn how it works.<\/p>\n<p>The steps to obtain, prepare and read into R the data we need to work with <em>aggregate<\/em> are exactly the same as in the <a title=\"Pivot Tables in R with melt and cast\" href=\"http:\/\/marcoghislanzoni.com\/blog\/2013\/10\/11\/pivot-tables-in-r-with-melt-and-cast\/\" target=\"_blank\" rel=\"noopener\">article<\/a> mentioned previously, however I will include them below for your convenience.<\/p>\n<h3>1. Download the sample data file<\/h3>\n<p>Use the link at the bottom of <a title=\"Pivot Tables in R with melt and cast\" href=\"http:\/\/marcoghislanzoni.com\/blog\/2013\/10\/11\/pivot-tables-in-r-with-melt-and-cast\/\" target=\"_blank\" rel=\"noopener\">this article<\/a> and save the file somewhere on your hard drive. So far so good!<\/p>\n<h3>2. Open the file in Excel and save a CSV copy of the first sheet<\/h3>\n<p>Double-click the file from the location where you saved it to open it inside Excel. The Excel worksheet has 3 tabs. We will be using the first one, containing the source data, and the last one, which contains a ready-made Pivot Table to play with.\u00a0If you do not know how to make Pivot Tables in Excel, I recommend you read the Microsoft tutorial. In this article we will focus on how to obtain the same results with R and we will use the ready-made pivot table on sheet 3.<\/p>\n<p>Once you are on the first sheet of the sample data set (the one with the source data), save a copy of it as CSV (Comma Separated Values) file. This will generate a file which is easier to import into R. R has packages which allow you to read directly Excel files without converting them to CSV, but for the sake of\u00a0simplicity\u00a0we will stick to CSV.<\/p>\n<p>Before saving as CSV, change the format of column E (Order Amount) to General so that the orders amounts appear as numbers with 2 decimals and not with a $ sign in front and comma separated thousands. If you export to CSV without doing this first, there will be extra steps required in R to convert the sales amounts to numeric (see the note at the end of the article).<\/p>\n<h3>3. Load the CSV file in R<\/h3>\n<p>This is an easy step accomplished with the\u00a0<em>read.csv<\/em>\u00a0function as follows.<\/p>\n<div id=\"crayon-54f0dff0607fc695745397\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff0607fc695745397-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff0607fc695745397-1\" class=\"crayon-line\"><span class=\"crayon-v\">data<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-o\">&#8211;<\/span> <span class=\"crayon-v\">read<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;file_name.txt&#8221;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">TRUE<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>file_name.txt is the name of the CSV file you created from Excel. If it is not in the current working directory in R, you can either change R\u2019s working directory with\u00a0<em>setwd<\/em>\u00a0or move the file to the current working directory or add a path to the file before the file name.<\/p>\n<p>At this point you should have the same base data open in Excel and loaded into R. In R the first lines will look like this:<\/p>\n<div id=\"crayon-54f0dff06080d749679271\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06080d749679271-1\">1<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06080d749679271-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06080d749679271-3\">3<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06080d749679271-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06080d749679271-5\">5<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06080d749679271-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06080d749679271-7\">7<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06080d749679271-8\">8<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff06080d749679271-1\" class=\"crayon-line\"><span class=\"crayon-o\">&gt;<\/span> <span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-e\">Country <\/span><span class=\"crayon-e\">Salesperson <\/span><span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">Date <\/span><span class=\"crayon-e\">OrderID <\/span><span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">Amount<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-3\" class=\"crayon-line\"><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">UK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Suyama<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">37812<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10249<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">1863.40<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">2<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-e\">USA\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">Peacock<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">37813<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10252<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">3597.90<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-5\" class=\"crayon-line\"><span class=\"crayon-cn\">3<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-e\">USA\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">Peacock<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">37814<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10250<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">1552.60<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">4<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">UK\u00a0\u00a0 <\/span><span class=\"crayon-i\">Dodsworth<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">37817<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10255<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">2490.50<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-7\" class=\"crayon-line\"><span class=\"crayon-cn\">5<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-e\">USA\u00a0\u00a0 <\/span><span class=\"crayon-i\">Leverling<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">37817<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10251<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">654.06<\/span><\/div>\n<div id=\"crayon-54f0dff06080d749679271-8\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">6<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">UK\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Buchanan<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">37818<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10248<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">440.00<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Now we are ready to get to work with\u00a0<em>aggregate<\/em>.<\/p>\n<h3>4. How aggregate works<\/h3>\n<p>As mentioned above,\u00a0<em>aggregate<\/em> is a much simpler function than\u00a0<em> melt<\/em> and\u00a0<em>cast.<\/em>\u00a0While it can have multiple syntaxes, the one we will work with, which applies well to data frames, is the following:<\/p>\n<div id=\"crayon-54f0dff060815313776908\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060815313776908-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff060815313776908-1\" class=\"crayon-line\"><span class=\"crayon-e\">aggregate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">formula<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">FUN<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">,<\/span>\u00a0<span class=\"crayon-v\">subset<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-t \">na<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">action<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-t \">na<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">omit<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The most relevant argument to understand is\u00a0<em>formula<\/em>. A formula as applicable to <em>aggregate<\/em>\u00a0is something like this:<\/p>\n<div id=\"crayon-54f0dff06081b712375513\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06081b712375513-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff06081b712375513-1\" class=\"crayon-line\"><span class=\"crayon-v\">what_to_aggregate<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-v\">aggregate_by<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>In the case of our data and following the example in the previous post, we want to aggregate the\u00a0<em>Order.Amount<\/em> by\u00a0<em>Salesperson<\/em>, therefore the formula we need is simply:<\/p>\n<div id=\"crayon-54f0dff060822249300780\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060822249300780-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff060822249300780-1\" class=\"crayon-line\"><span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">Amount<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-v\">Salesperson<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Beside the formula, we need to specify the\u00a0<em>data<\/em> argument, which will be equal to our data frame\u00a0<em>data<\/em> (I know, sorry for haven chosen a data frame name that is the same of an argument name! I hope you can bear with me anyway\u2026), and the <em>FUN<\/em> argument, which is the function we want to use for the aggregation. In the case of our example, we want to aggregate by summing up all sales order for each sales person, therefore\u00a0<em>FUN=sum<\/em> is what we need.<\/p>\n<p>The extra arguments\u00a0<em> subset<\/em> allows us to subset the data before aggregating them. Say, for example, you want to make a pivot only for the sales persons in USA, you can use\u00a0<em>subset=Country==\u201dUSA\u201d<\/em>. Remember that the assignment operator = is different than the comparison operator ==. If it is confusing to you how to read the\u00a0<em>subset<\/em>\u00a0argument, you can also write it like this:\u00a0<em>subset=(Country==\u201dUSA\u201d)<\/em>.<\/p>\n<p>Finally the argument\u00a0<em>na.action<\/em> allows us to specify what to do with missing (N\/A) values. The default is to omit them from the aggregation.<\/p>\n<p>Ok, enough with the explanations, now we are ready to make our first pivot table with\u00a0<em>aggregate<\/em>. Here is the command:<\/p>\n<div id=\"crayon-54f0dff06082a953110950\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06082a953110950-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff06082a953110950-1\" class=\"crayon-line\"><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">a<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-o\">&#8211;<\/span> <span class=\"crayon-e\">aggregate<\/span><span class=\"crayon-sy\">(<\/span> <span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">Amount<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-v\">Salesperson<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">data<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">FUN<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sum<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And this is the result (which, as expected, is identical to that from <em>melt<\/em> and <em>cast<\/em>):<\/p>\n<div id=\"crayon-54f0dff060830831948308\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060830831948308-1\">1<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff060830831948308-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060830831948308-3\">3<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff060830831948308-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060830831948308-5\">5<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff060830831948308-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060830831948308-7\">7<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff060830831948308-8\">8<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060830831948308-9\">9<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff060830831948308-10\">10<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060830831948308-11\">11<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff060830831948308-1\" class=\"crayon-line\"><span class=\"crayon-o\">&gt;<\/span> <span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">a<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-e\">Salesperson <\/span><span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">Amount<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-3\" class=\"crayon-line\"><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Buchanan<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">68792.25<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">2<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Callahan<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">123032.67<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-5\" class=\"crayon-line\"><span class=\"crayon-cn\">3<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">Davolio<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">182500.09<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">4<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-i\">Dodsworth<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">75048.04<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-7\" class=\"crayon-line\"><span class=\"crayon-cn\">5<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Fuller<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">162503.78<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-8\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">6<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">King<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">116962.99<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-9\" class=\"crayon-line\"><span class=\"crayon-cn\">7<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-i\">Leverling<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">201196.27<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-10\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">8<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">Peacock<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">225763.68<\/span><\/div>\n<div id=\"crayon-54f0dff060830831948308-11\" class=\"crayon-line\"><span class=\"crayon-cn\">9<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Suyama<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">72527.63<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Congratulations on your first pivot table with\u00a0<em>aggregate<\/em>! <img decoding=\"async\" class=\"wp-smiley\" src=\"http:\/\/marcoghislanzoni.com\/blog\/wp-includes\/images\/smilies\/icon_smile.gif\" alt=\":-)\" \/><\/p>\n<h3>5. Adding Grand Totals<\/h3>\n<p>Sorry to delude you, but this is where\u00a0<em>aggregate<\/em> falls short of<em> melt<\/em> and\u00a0<em>cast<\/em>. In fact there is no option to add Grand Totals directly through<em>aggregate<\/em>. Yes, there are workarounds available which I may cover them in a future post, but no direct methods.<\/p>\n<h3>6. How to filter<\/h3>\n<p>We briefly touched on filtering while describing the\u00a0<em>subset<\/em> argument above. Just add a subsetting criteria to the call to\u00a0<em>aggregate<\/em> to pre-filter the data on which to aggregate. For example, wanting to aggregate only the sales order for the sales persons based in USA the new syntax is:<\/p>\n<div id=\"crayon-54f0dff060838650159061\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060838650159061-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff060838650159061-1\" class=\"crayon-line\"><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">a<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-o\">&#8211;<\/span> <span class=\"crayon-e\">aggregate<\/span><span class=\"crayon-sy\">(<\/span> <span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">Amount<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-v\">Salesperson<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">data<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">FUN<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sum<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">subset<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">Country<\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-s\">&#8220;USA&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And this is the output:<\/p>\n<div id=\"crayon-54f0dff06083e408288103\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06083e408288103-1\">1<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06083e408288103-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06083e408288103-3\">3<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06083e408288103-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06083e408288103-5\">5<\/div>\n<div class=\"crayon-num crayon-striped-num\" data-line=\"crayon-54f0dff06083e408288103-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06083e408288103-7\">7<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff06083e408288103-1\" class=\"crayon-line\"><span class=\"crayon-o\">&gt;<\/span> <span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">a<\/span><\/div>\n<div id=\"crayon-54f0dff06083e408288103-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-e\">Salesperson <\/span><span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">Amount<\/span><\/div>\n<div id=\"crayon-54f0dff06083e408288103-3\" class=\"crayon-line\"><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Callahan<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">123032.7<\/span><\/div>\n<div id=\"crayon-54f0dff06083e408288103-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">2<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">Davolio<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">182500.1<\/span><\/div>\n<div id=\"crayon-54f0dff06083e408288103-5\" class=\"crayon-line\"><span class=\"crayon-cn\">3<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">Fuller<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">162503.8<\/span><\/div>\n<div id=\"crayon-54f0dff06083e408288103-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-cn\">4<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-i\">Leverling<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">201196.3<\/span><\/div>\n<div id=\"crayon-54f0dff06083e408288103-7\" class=\"crayon-line\"><span class=\"crayon-cn\">5<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">Peacock<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">225763.7<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Congratulations! You have just learned another easy way to make Pivot Tables in R using\u00a0<em>aggregate<\/em>. <img decoding=\"async\" class=\"wp-smiley\" src=\"http:\/\/marcoghislanzoni.com\/blog\/wp-includes\/images\/smilies\/icon_smile.gif\" alt=\":-)\" \/><\/p>\n<p>You can stop here or, if you feel brave enough and want to move to the next level, read the next optional paragraph.<\/p>\n<h3>7. Aggregating more columns and with more criteria at once<\/h3>\n<p>You may wonder about the syntax of the\u00a0<em>formula<\/em> inside\u00a0<em>aggregate<\/em> in case you want (or need) to aggregate more columns at once (the left side of the formula) according to multiple criteria (the right side of the formula). Well, here is the syntax you can use for 3 columns and 3 criteria (by):<\/p>\n<div id=\"crayon-54f0dff060846327870704\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff060846327870704-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff060846327870704-1\" class=\"crayon-line\"><span class=\"crayon-e\">cbind<\/span><span class=\"crayon-sy\">(<\/span> <span class=\"crayon-v\">column_1<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">column_2<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">column<\/span><span class=\"crayon-sy\">_<\/span>3 <span class=\"crayon-sy\">)<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-v\">criteria_1<\/span> <span class=\"crayon-o\">+<\/span> <span class=\"crayon-v\">criteria_2<\/span> <span class=\"crayon-o\">+<\/span> <span class=\"crayon-v\">criteria_3<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The aggregation function specified by <i>FUN<\/i> will be applied to each column specified on the left side of the formula after the data have been partitioned (grouped) according to the criteria specified on the right side of the formula.<\/p>\n<p>To make a simpler example that fits with our data (which only have one numerical column), let\u2019s say we want to aggregate on the Order Amount primarily by Order Data and secondarily by Country. We can easily issue to R a command like this:<\/p>\n<div id=\"crayon-54f0dff06084d510142006\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-toolbar\" data-settings=\" mouseover overlay hide delay\"><span class=\"crayon-title\">Aggregation on two criteria<\/span><\/p>\n<div class=\"crayon-tools\">\n<div class=\"crayon-button crayon-nums-button crayon-pressed\" title=\"Toggle Line Numbers\"><\/div>\n<div class=\"crayon-button crayon-plain-button\" title=\"Toggle Plain Code\"><\/div>\n<div class=\"crayon-button crayon-copy-button\" title=\"Copy\"><\/div>\n<div class=\"crayon-button crayon-popup-button\" title=\"Open Code In New Window\"><\/div>\n<p><span class=\"crayon-language\">R<\/span><\/div>\n<\/div>\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-54f0dff06084d510142006-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-54f0dff06084d510142006-1\" class=\"crayon-line\"><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">a<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-o\">&#8211;<\/span> <span class=\"crayon-e\">aggregate<\/span><span class=\"crayon-sy\">(<\/span> <span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">Amount<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-v\">Order<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">Date<\/span> <span class=\"crayon-o\">+<\/span> <span class=\"crayon-v\">Country<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">data<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">FUN<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">sum<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This will produce a Pivot Table where the Order Amount for each Order Date and Country combination has been aggregated using the <em>sum<\/em>function.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>12 months ago Marco Ghislanzoni [Total: 1 \u00a0 \u00a0Average: 3\/5] I noted that a previous post about Pivot Tables in R with melt and cast&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-815","post","type-post","status-publish","format-standard","hentry","category-r"],"_links":{"self":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts\/815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/comments?post=815"}],"version-history":[{"count":0,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts\/815\/revisions"}],"wp:attachment":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/media?parent=815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/categories?post=815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/tags?post=815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}