Importing and Manipulating Symmetric Input-Output Tables

Pre-processing and basic analytical tasks related to working with Eurostat's symmetric input-output tables and provide basic input-output economics calculations. The package is part of rOpenGov <> to open source open government initiatives.



The symmetric input-output tables (SIOTs) are complex statistical products that present inter-related statistics in a predefined structure. They are often found in spreadsheets that follow this structure, or in the case Eurostat in a data repository. In both cases they in reproducible research must be downloaded and restructured to programmatically accessible form. Often these highly structured statistics need to be analyzed together with other data, for example, when employment effects and multipliers are calculated. In this case processing the employment data to SIOT conforming format is a significant preprocessing challenge.

The iotables are exactly designed for these tasks. Currently the package downloads and processes standardized European SIOTs conforming to the latest statistical regulations, i.e. SIOTs starting from the year 2010.

The aim of this introduction is not to introduce input-output economics, or SIOTs in detail. The Eurostat Manual of Supply, Use and Input-Output Tables and the Eurostat tematic page [Eurostat Manual] in the documentation should be consulted for further information about the data and the metadata.

In order to test the analytical functions of the package and to have a manageable sized example data set, we use the real-life data from the Eurostat manual. The germany_1990 dataset is a simplified 6x6 sized SIOT taken from the Eurostat SIOT manual (page 481). The package function examples can be checked against publisehd results from Jörg Beutel. These calculations can be followed in the Germany 1990 vignette.

The calculation of induced effects (Type-II multipliers) are following the Input-Output Multipliers Specification Sheet and Supporting Material, Spicosa Project Report. The analytical functions are tested against this example, too.


You can install iotools from CRAN or the latest development version with github:

#devtools::install_github("rOpenGov/iotables", build_vignettes = TRUE)

You can follow changes on the file.

Acquiring data

Eurostat's data can be downloaded in several tidy, long-form, files, and a lot of filtering is needeed to start working with it.

Currently the following Eurostat SIOTs can be used:

  • product x product SIOTs naio_10_cp1700 or naio_10_pyp1700;

  • industry x industry SIOTs naio_10_cp1750 ornaio_10_pyp1750;

  • use tables at basic prices naio_10_cp1620 or naio_10_pyp1610;

  • trade and transport margins naio_10_cp1620 or naio_10_pyp1620;

  • net taxes less subsidies naio_10_cp1630 or naio_10_pyp1630;

  • Supply table at basic prices incl. transformation into purchasers' prices (naio_10_cp15) and Use table at purchasers' prices (naio_10_cp16).

The cp element refers to basic prices and the pyp to previous years' prices.


Given the complexity of the data used by the package, probably the use of the vignettes is needed to get a start.

The Germany 1990 vignette presentes most of the examples of the Eurostat Manual of Supply, Use and Input-Output Tables (Eurostat Manual, Chapter 15.) This is a good introduction to understand what will the functions do, and to check that they work correctly. The testthat infrastructure of the package checks the proper working of the functions against the published results from the Eurostat Manual.

The Working with Eurostat Data vignette shows how you can download, pre-process and use real data from Eurostat.

The United Kingdom Input-Output Analytical Tables 2010 are used for testing the iotables package, because they are well-documented and detailed, organized data is available with them. These calculations can be followed in the United Kingdom Input-Output Analyitcal Tables vignette.


iotables 0.1.3

  • Added a file to track changes to the package.
  • Added Contributor Code of Conduct in
  • Some functions have paralel versions, and will be brought to rOpenSci naming conventions (object_verb())
  • Asked to join rOpenGov - excited but inexperienced in this!

iotables 0.1.4

New functions are added which enable a very simple IO analysis. As an important milestone, an analytical solution comparable to the Eurostat manual, the German employment indicators are correctly calculated (see README)

  • The input_indicator_create() creates the indicators.
  • The equation_solve() solves the basic input-output equations on real-life data, i.e. correctly prepared the two sides of the equation product- or industrywise.
  • The multiplier_create() is a wrapper around the more general equation_solve()
  • The README contains examples to use this new functions.
  • Some new tests are added to the testthat functions.
  • Further example data is added from Croatia, together with the employment_aggregate() helper function to match SIOT data with non-conforming employment statistics.
  • There is a vignette called Working with Croatian Symmetric Input-Output Tables that shows some real-life uses.
  • Testing on Travis (ubuntu and OSX tests.)

iotables 0.2

The forthcoming update will rewrite and generalize some of the earlier functions. In particular, the following features will be available:

  • Handling 7 types of Eurostat tables, not only the current price table.
  • Closing off households, i.e. including endogenous demand for induced effects.
  • Guidelines to work with OECD mass downloader.
  • Some earlier functions are phased out, because they are successfully generalized.
  • The standard system.rda contains the metadata necessary to re-order the bulk files. This will require a lot of patient testing, and it can be always updated with new data sources.

At this point I will go with preparing a release the table on CRAN. The current version builds without warnings or notes on Windows and Linux.

iotables 0.2 is moved to rOpenGov.

iotables 0.2.1

  • Correctly handles the total Eurostat national accounts vocabulary, and adds all Croatian (not fully conforming) tables to the package.

iotables 0.2.2

  • Updated README file and new Croatia vignette.

iotables 0.2.3

  • Eurostat withdrew naio_cp17_r2, and there is a temporary fix to work with archived versions. Some metadata errors and documentation errors were corrected.

iotables 0.2.4

  • Some documentation improvements. This version was submitted for CRAN for release.

iotables 0.2.5

  • Some documentation improvements.

iotables 0.2.6

  • Download naio_10_cp1620 (trade and transport margins) or naio_10_cp1630 (net taxes) with the parameter stk_flow="TOTAL". Correctly builds on Windows and Mac OS (old and release version) but problem with the dependency eurostat in Linux on Travis.

iotables 0.2.7

Default data directory for faster programmatic use and phasing out discountinued Eurostat statistics. A bit improved messages and documentation.

iotables 0.2.8

Handles tables with purchasers' prices. Imports Eurostat employment data.

iotables 0.2.9

Error corrected concerning creation of temporary files on non-Windows environments. No uses file.path() to create platform-independent files. Released on CRAN.

iotables 0.3.0

  • Correctly handles some countries that differ from the standard SIOT structure. The Czech Republic does not include G47 and I68 imputed rents in the table, which caused problems with the ordering of the table and the creation of coefficients.
  • Uses tidyr::nested() data structures which are far easier handled in highly structured data sets.

iotables 0.3.1

  • Correcting a bug that did not always remove the right columns from use_table_get(). Released on CRAN.

iotables 0.3.2

  • Better exception handling in equation_solve(). Removes trivial erroneous, all-zero columns. Efficiency gains in indicator and multiplier creation. New function to create backward linkages. Released on CRAN.

iotables 0.3.3

  • New vignette Germany 1990 with the Eurostat Manual of Supply, Use and Input-Output Tables example tables to show the working of the data processing and analytical functions.
  • Finding an exception in the Eurostat vocabulary that preventing correctly identifying the "Computer programming, consultancy and related services; Information services" industry in the rows. This is a critical problem in the Eurostat bulk files that prevents the creation of symmetric matrixes.
  • Minor bug fixes.
  • New function output_coefficient_matrix_create()
  • New function output_multiplier_create()
  • New function forward_linkages()
  • New function backward_linkages()

iotables 0.3.4

  • New function direct_effects() which calculates all input indicators that input_indicator_create() does individually.
  • New vignette to work with real Eurostat data.
  • New package website.
  • The ReadMe file shortened, most of the contents are moved now to the two vignettes.

iotables 0.3.5

  • New function iotable_year_get() which returns the available tables by year or time from the bulk database for a given country and currency unit.
  • Package now handles Use table at basic prices (naio_10_cp1610 and naio_10_pyp1610), Supply table at basic prices incl. transformation into purchasers' prices (naio_10_cp15), Use table at purchasers' prices (naio_10_cp16) after correcting a vocabulary error.
  • This version is a release candidate for CRAN.

iotables 0.3.6

  • New analytical function coefficient_matrix_create() which is a more general version of input_coefficient_matrix_create() and will eventually replace that function.
  • Custom SIOTs are supported, but there is no vignette yet to describe their use in detail.

iotables 0.3.7

  • New example data(netherlands_2006), terminology and analytical improvements following Input-Output Multipliers Specification Sheet and Supporting Material, Spicosa Project Report. Results are checked against the publication.
  • For terminological clarity, earlier direct_supply_effects_create() function is renamed direct_supply_effects_create().
  • The function effects_create() currently refers to the function returning direct effects of a change in demand.
  • The function multipliers_create() refers to the function returning direct and indirect effects of a change in demand.
  • The Germany 1990 vignette needs to be reviewed. Currently it may not be consistent with effects and multipliers, it will be included in the next development version.

iotables 0.3.8

  • Function input_indicator_create() has a new, optional parameter for naming the new indicators in the key column.
  • New convenience function for nicer printing of structured SIOT tables and related matrix results. Not yet exported, first will be used on vignettes only.

iotables 0.3.9

This is a much improved, simplified pre-release version, with highly improved performance, more consistent function interface and far more readable code. The last CRAN release is stable, the following version will be a stable, better release candidate.

  • The Germany example is converted to the ESA2010 vocabulary.
  • The output_get() is now a wrapper around primary_input_get() and gva_get() is completely deprecated.
  • The input_coefficient_matrix_create() is now a wrapper around the more general coefficient_matrix_create().
  • The use_table_get() function is now named input_flow_get() but it is seldom used, as the analytical function will call it as needed.
  • A completely dataset, metadata and vignette was added to test the functions on the United Kingdom Input-Output Analytical Tables, 2010. article and dataset.
  • The new function supplementary_add() can add a supplementary account or row to the table, useful to add employment data, for example.
  • The new function total_tax_add() adds a summary of product and production taxes among the primary inputs.
  • Clearly divided analytical functions, direct_effects_create() , indirect_effects_create(), input_multiplier_create() create the direct, indirect and total effects matrix.

iotables 0.4

New vignette United Kingdom Input-Output Analyitcal Tables to compare analytical function results with published results from the UK National Office for Statistics.

iotables 0.4.1

A small formatting error in the documentation of netherlands_2006 threw up a note on CRAN.

iotables 0.4.2

On CRAN 0.4.1 passed early tests, but on deployment it turned out that a dependency is not available for i386-pc-solaris2.10 (32-bit). This dependency is magick, which was supposed to help printing vignettes in Word (a very rare case) for kableExtra is not available on Solaris. I removed this dependency.

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


0.4.5 by Daniel Antal, 3 months ago

Report a bug at

Browse source code at

Authors: Daniel Antal [aut, cre] , Kasia Kulma [ctb] , Pyry Kantanen [ctb]

Documentation:   PDF Manual  

MIT + file LICENSE license

Imports dplyr, eurostat, magrittr, tidyr, stats, forcats, utils, plyr, lubridate, knitr, kableExtra, tibble, readxl, purrr, tidyselect, rlang

Suggests testthat, rmarkdown, spelling, covr

See at CRAN