Tabyl: A Frequency Desk for the Fashionable R Person | by Zvonimir Boban | Might, 2023

Out with the previous, in with the brand new!

Picture created utilizing Canva Picture Generator

Anyone who has labored with categorical information finally got here throughout a have to calculate absolutely the quantity and proportion of a sure class. This text introduces the tabyl operate for creating frequency tables by a collection of hands-on examples.

What does tabyl carry to the desk (no pun meant :D)?

The tabyl operate is a characteristic of the janitorbundle in R. It’s a really handy instrument for creating contingency tables, in any other case often called frequency tables or cross-tabulations. Listed below are among the advantages of utilizing tabyl:

1. Straightforward syntax: tabyl has an easy-to-use syntax. It may take one, two, or three variables, and it routinely returns an information body that features counts and proportions.

2. Flexibility: tabyl can generate one-way (single variable), two-way (two variables), and three-way (three variables) contingency tables. This flexibility makes it appropriate for a variety of functions.

3. Computerized calculation of proportions: tabyl routinely calculates the proportions (percentages) for one-way contingency tables. For 2 and three-way tables, the identical outcome will be completed together with the adorn_percentages operate from the identical bundle.

4. Compatibility with dplyr: The output of tabyl is an information body (or tibble), which makes it absolutely appropriate with dply features and the tidyverse ecosystem. This implies you’ll be able to simply pipe %>% the output into additional information wrangling or visualization features.

5. Neat and informative output: tabyl gives neat and informative output, which incorporates the variable names as row names and column names, making it simpler to interpret the outcomes.

For all these causes, tabyl is a superb selection while you wish to create frequency tables in R. It simplifies many steps and integrates properly with the tidyverse strategy to information evaluation.

The dataset

Picture by Hans Veth on Unsplash

This publish will display the advantages of the tabyl operate from the janitor bundle utilizing the info on the edibility of several types of mushrooms relying on their odor. Right here, I will likely be utilizing a tidied dataset beneath the identify mushrooms, however you’ll be able to entry the original data on Kaggle. Beneath is the code used for cleansing the info.


mushrooms <- read_csv("mushrooms.csv") %>%
choose(class, odor) %>%
class = case_when(
class == "p" ~ "toxic",
class == "e" ~ "edible"
odor = case_when(
odor == "a" ~ "almond",
odor == "l" ~ "anise",
odor == "c" ~ "creosote",
odor == "y" ~ "fishy",
odor == "f" ~ "foul",
odor == "m" ~ "musty",
odor == "n" ~ "none",
odor == "p" ~ "pungent",
odor == "s" ~ "spicy"

If you’re unfamiliar with the above syntax, please take a look at a hands-on information to utilizing the tidyverse in certainly one of my earlier articles.

The previous

To be able to higher perceive which benefitstabyl presents, let’s first make a frequency desk utilizing the bottom R desk operate.


edible toxic
4208 3916

desk(mushrooms$odor, mushrooms$class)

edible toxic
almond 400 0
anise 400 0
creosote 0 192
fishy 0 576
foul 0 2160
musty 0 36
none 3408 120
pungent 0 256
spicy 0 576

Unsurprisingly, it seems that odor is a superb predictor of mushroom edibility, with something “funny-smelling” in all probability being toxic. Thanks evolution! Additionally, there appear to be many extra toxic mushrooms, so it’s all the time vital to be cautious when choosing mushrooms by yourself.

If we would like to have the ability to use the variable names straight with out specifying the $ operator, we would wish to make use of the with command to make the dataset out there to the desk operate.

mush_table <- with(mushrooms, desk(odor, class))

Sadly, if we wish to improve to proportions as an alternative of absolute numbers, we can’t use the identical operate however one other one as an alternative — prop.desk .


odor edible toxic
almond 0.049236829 0.000000000
anise 0.049236829 0.000000000
creosote 0.000000000 0.023633678
fishy 0.000000000 0.070901034
foul 0.000000000 0.265878877
musty 0.000000000 0.004431315
none 0.419497784 0.014771049
pungent 0.000000000 0.031511571
spicy 0.000000000 0.070901034

By default, this offers us a column-wise proportion desk. If we would like row-wise proportions, we will specify the margin argument (1 for row-wise and a pair of for column-wise).

prop.desk(mush_table, margin = 1)

odor edible toxic
almond 1.00000000 0.00000000
anise 1.00000000 0.00000000
creosote 0.00000000 1.00000000
fishy 0.00000000 1.00000000
foul 0.00000000 1.00000000
musty 0.00000000 1.00000000
none 0.96598639 0.03401361
pungent 0.00000000 1.00000000
spicy 0.00000000 1.00000000

All these particular features can really feel cumbersome and arduous to recollect, so a single operate which comprises all of the above funcionality can be good to have.

Moreover, if we verify the kind of the created object utilizing the class(mush_table) command, we see that it’s of a category desk.

This creates a compatibility drawback, since these days R customers are principally utilizing the tidyverse ecosystem which is centered round making use of features to information.body sort objects and stringing the outcomes collectively utilizing the pipe (%>%) operator.

The brand new

Let’s do the identical issues with the tabyl operate.

tabyl(mushrooms, class)

class n p.c
edible 4208 0.5179714
toxic 3916 0.4820286

mush_tabyl <- tabyl(mushrooms, odor, class)

odor edible toxic
almond 400 0
anise 400 0
creosote 0 192
fishy 0 576
foul 0 2160
musty 0 36
none 3408 120
pungent 0 256
spicy 0 576

In comparison with the corresponding desk output, the ensuing tables aretidier utilizing the tabyl operate, with variable names (class) being explicitly acknowledged. Furthermore, for the one-way desk, except for numbers, the odds are routinely generated as properly.

We are able to additionally discover the that we didn’t have to make use of the which functio to have the ability to specify the variable names straight. Moreover, working class(mush_tabyl) tells us that the ensuing object is of a information.body class which ensures tidyverse compatibility!

The adorned janitor

Picture created utilizing Canva Picture Generator

For extra tabyl functionalities, the janitor bundle additionally comprises a collection of adorn features. To get the odds, we merely pipe the ensuing frequency desk to the adorn_percentages operate.

mush_tabyl %>% adorn_percentages()

odor edible toxic
almond 1.0000000 0.00000000
anise 1.0000000 0.00000000
creosote 0.0000000 1.00000000
fishy 0.0000000 1.00000000
foul 0.0000000 1.00000000
musty 0.0000000 1.00000000
none 0.9659864 0.03401361
pungent 0.0000000 1.00000000
spicy 0.0000000 1.00000000

If we would like the column-wise percentages, we will specify the denominator argument as “col”.

mush_tabyl %>% adorn_percentages(denominator = "col")

odor edible toxic
almond 0.09505703 0.000000000
anise 0.09505703 0.000000000
creosote 0.00000000 0.049029622
fishy 0.00000000 0.147088866
foul 0.00000000 0.551583248
musty 0.00000000 0.009193054
none 0.80988593 0.030643514
pungent 0.00000000 0.065372829
spicy 0.00000000 0.147088866

The tabyladorn combo even permits us to simply mix each the quantity and proportion in a identical desk cell…

mush_tabyl %>% adorn_percentages %>% adorn_ns

odor edible toxic
almond 1.0000000 (400) 0.00000000 (0)
anise 1.0000000 (400) 0.00000000 (0)
creosote 0.0000000 (0) 1.00000000 (192)
fishy 0.0000000 (0) 1.00000000 (576)
foul 0.0000000 (0) 1.00000000 (2160)
musty 0.0000000 (0) 1.00000000 (36)
none 0.9659864 (3408) 0.03401361 (120)
pungent 0.0000000 (0) 1.00000000 (256)
spicy 0.0000000 (0) 1.00000000 (576)

… or add the totals to the rows and columns.

mush_tabyl %>% adorn_totals(c("row", "col"))

odor edible toxic Complete
almond 400 0 400
anise 400 0 400
creosote 0 192 192
fishy 0 576 576
foul 0 2160 2160
musty 0 36 36
none 3408 120 3528
pungent 0 256 256
spicy 0 576 576
Complete 4208 3916 8124


The tabyl() operate from the janitor bundle in R presents a user-friendly and versatile answer for creating one-way, two-way, or three-way contingency tables. It excels in routinely computing proportions and producing tidy information frames that combine seamlessly with the tidyverse ecosystem, particularly dplyr. Its outputs are well-structured and simple to interpret, and it may be additional enhanced with adorn features, simplifying the general strategy of producing informative frequency tables. This makes tabyl() a extremely helpful instrument in information evaluation in R.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button