Apply family functions – Part 2

[This article was first published on Posts on, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

In this second part of the post series on the apply family of functions, it is the tapply() function. Unlike the apply () function discussed in the first post, the tapply() function is often used to apply a function to subsets of a vector. Usually, when working with databases, there are variables of different nature, some can be numerical, others categorical, the idea of tapply() is to obtain summaries of a vector but being grouped concerning other vectors (variables).

On this occasion, we will use the starwars database seen in the post on the inspectdf package again.

If we need to know the average height of the characters, execute the following command.

mean(starwars$height, na.rm = TRUE)
## [1] 174.358

However, it is more valuable to obtain the average height according to another variable of interest that allows us to make some comparison, such as gender. For this, we can use the tapply() function.

tapply(X=starwars$height,
INDEX=starwars$gender,
FUN=mean) 
## feminine masculine
## NA NA

The NA that appear are due to missing values within the database, so the mean() function does not calculate the average correctly unless an imputation of these missing values is made or indicated that the mean() function must omit the missing values using the argument na.rm = TRUE. In most of the apply family functions, the arguments that belong to the function being applied (in this case mean()) must go after the FUN argument.

tapply(X=starwars$height,
INDEX=starwars$gender,
FUN=mean,
na.rm=TRUE) 
## feminine masculine
## 164.6875 176.5161

The tapply() function is not limited to a single grouping variable. The same “dimensions” concept that we discuss in the apply () function can be used to tapply(), but this time the grouping variables must be specified within a list. As an example, suppose we are interested in the average height according to gender and eye color.

tapply(X=starwars$height,
INDEX=list(starwars$eye_color, starwars$gender),
FUN=mean,
na.rm=TRUE)
## feminine masculine
## black 195.5 182.0000
## blue 167.0 189.7500
## blue-gray NA 182.0000
## brown 160.0 167.3846
## dark NA NaN
## gold NA 191.0000
## green, yellow NA 216.0000
## hazel 178.0 170.0000
## orange NA 180.5000
## pink NA 180.0000
## red NA 154.8000
## red, blue 96.0 NA
## unknown NA 136.0000
## white NA NA
## yellow 168.0 178.8000

We can add more grouping variables, but all of them must be within the list. For example, it is possible to grouping also by the skin color, although in this case, the result would show many missing values because not all combinations exist. That is a demonstration that each time we grouping variables, these groupings should make sense; otherwise, the analysis will not be useful.

tapply(X=starwars$height,
INDEX=list(starwars$eye_color, starwars$gender, starwars$skin_color),
FUN=mean,
na.rm=TRUE)
## , , blue
##
## feminine masculine
## black NA NA
## blue NA 196
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel 178 NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , blue, grey
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 115.5
##
## , , brown
##
## feminine masculine
## black NA NA
## blue NA 234.0
## blue-gray NA NA
## brown NA 129.5
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 198.0
##
## , , brown mottle
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 180
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , brown, white
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA 216
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , dark
##
## feminine masculine
## black NA NA
## blue 184 NA
## blue-gray NA NA
## brown NA 183.3333
## dark NA NaN
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , fair
##
## feminine masculine
## black NA NA
## blue 158.5 180.8571
## blue-gray NA 182.0000
## brown 163.0 185.3333
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA 170.0000
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , fair, green, yellow
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow 168 NA
##
## , , gold
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 167
##
## , , green
##
## feminine masculine
## black NA 184.5
## blue NA NA
## blue-gray NA NA
## brown NA 66.0
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 206.0
## pink NA NA
## red NA 190.0
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 183.0
##
## , , green-tan, brown
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 175
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , green, grey
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA 193
## white NA NA
## yellow NA NA
##
## , , grey
##
## feminine masculine
## black 213 198.3333
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA 191.0000
## green, yellow NA NA
## hazel NA NA
## orange NA 224.0000
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , grey, blue
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA 79
## white NA NA
## yellow NA NA
##
## , , grey, green, yellow
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 163
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , grey, red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 112
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , light
##
## feminine masculine
## black NA NA
## blue 165.00 176.5
## blue-gray NA NA
## brown 159.25 185.5
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NaN NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , metal
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 200
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , mottled green
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 191
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , none
##
## feminine masculine
## black NA NaN
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , orange
##
## feminine masculine
## black NA 188
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 196
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , pale
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 188
## pink NA 180
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 184
##
## , , red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 175
##
## , , red, blue, white
##
## feminine masculine
## black 178 NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , silver, red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue 96 NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , tan
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA 187
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , unknown
##
## feminine masculine
## black NA NA
## blue NA 228
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , white
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 233
##
## , , white, blue
##
## feminine masculine
## black NA 122
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 96
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , white, red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 97
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , yellow
##
## feminine masculine
## black NA NA
## blue 168 NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA

To leave a comment for the author, please follow the link and comment on their blog: Posts on.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)