Since the year 2011, the Swiss Federal Office of Agriculture (FOAG) and later the Federal Food Safety and Veterinary Office, now responsible for the authorisation of plant protection products in Switzerland, publish the contents of the Swiss Register of Plant Protection Products (SRPPP) on their respective websites in a custom format based on the Extensible Markup Language (XML).
In our group
at Agroscope, different solutions have been used to read in, process and
use these data. This package offers a fresh approach to directly read in
the data into R
.
The current download location of the latest published XML version of
the SRPPP is stored in the package as srppp::srppp_xml_url
.
Reading in the current data is as simple as
The resulting data object contains a number of related tables with
information on the authorized products and their uses. The relation
between those tables is shown below. The identification numbers of the
evaluated products (pNbrs
) and the general information
associated with them are shown in dark blue. The tables defining their
composition in terms of the most important ingredients are shown in
orange. Tables with information on the authorized uses of the products
are shown in dark green. Finally, the tables giving names and expiration
dates of products and parallel imports as well as an identification
number for the authorization holder are shown in light blue.
At the bottom of the table hierarchy, there is the list of
substances. For each substance, there is a primary key pk
,
a chemical name based on IUPAC
nomenclature, and substance names in the official languages of
Switzerland. The first four entries out of 446 are shown below.
library(knitr)
current_register$substances |>
select(pk, iupac, substance_de, substance_fr, substance_it) |>
head(n = 4L) |>
kable()
pk | iupac | substance_de | substance_fr | substance_it |
---|---|---|---|---|
3 | 1-naphthylacetic acid | 1-Naphthylacetic acid | 1-naphtyl acide acétique | Acido 1-naftilacetico |
4 | (2,4-dichlorophenoxy)acetic acid | 2,4-D | 2,4-D | 2,4-D |
8 | avermectin B1 | Abamectin | abamectine | Abamectina |
13 | 2-chloro-6-nitro-3-phenoxyaniline | Aclonifen | aclonifène | Aclonifen |
There are three tables defining the products, pNbrs
,
products
and ingredients
. The P-Numbers
contained in the table pNbrs
are identifiers of product
compositions. Products with the same P-Number are considered equivalent
in terms of efficacy and risks. The table pNbrs
is only
there for a technical reason. It simply contains a column holding the
P-Numbers.
The composition of these products in terms of active substances,
additives to declare, synergists and safeners is is defined in the table
ingredients
, giving the contents in percent weight per
weight (percent
). For liquid products, a content in grams
per litre is also given (g_per_L
). If a substance is
contained in a form that differs from the definition given in the
substance table, this is documented in the respective additional columns
as illustrated by the first five rows shown below.
current_register$ingredients |>
select(pNbr, pk, type, percent, g_per_L, ingredient_de, ingredient_fr) |>
head(n = 5L) |>
kable()
pNbr | pk | type | percent | g_per_L | ingredient_de | ingredient_fr |
---|---|---|---|---|---|---|
38 | 338 | ACTIVE_INGREDIENT | 80.0 | |||
1182 | 1067 | ACTIVE_INGREDIENT | 34.7 | 400 | als 38.0% MCPB-Natrium-Salz (439 g/l) | sous forme de 38.0 % MCPB de sel de sodium (439 g/L) |
1192 | 1067 | ACTIVE_INGREDIENT | 34.7 | 400 | als 38.0 % MCPB-Natrium-Salz (439 g/L) | sous forme de 38.0 % MCPB de sel de sodium (439 g/L) |
1263 | 338 | ACTIVE_INGREDIENT | 80.0 | |||
1865 | 1027 | ACTIVE_INGREDIENT | 99.1 | 830 |
The frequency of occurrence of the four different ingredient types is quite different.
library(dplyr)
current_register$ingredients |>
select(pk, type) |>
unique() |>
group_by(type) |>
summarize(n = n()) |>
kable()
type | n |
---|---|
ACTIVE_INGREDIENT | 337 |
ADDITIVE_TO_DECLARE | 105 |
SAFENER | 5 |
SYNERGIST | 2 |
Additives to declare are additives that have an effect on classification and labelling of the product. All substances occurring as synergists or safeners are listed below.
current_register$ingredients |>
left_join(current_register$substances, by = "pk") |>
filter(type %in% c("SYNERGIST", "SAFENER")) |>
group_by(type, substance_de) |>
summarize(n = n(), .groups = "drop_last") |>
select(type, substance_de, n) |>
arrange(type, substance_de) |>
kable()
type | substance_de | n |
---|---|---|
SAFENER | Benoxacor | 1 |
SAFENER | Cloquintocet-mexyl | 17 |
SAFENER | Cyprosulfamid | 2 |
SAFENER | Isoxadifen-ethyl | 3 |
SAFENER | Mefenpyr-Diethyl | 10 |
SYNERGIST | Piperonyl butoxid | 6 |
SYNERGIST | Sesamöl raffiniert | 3 |
Note that the first two lines in the code could also be replaced by
which makes use of the foreign key declaration in the data object.
However, the more explicit version using left_join
is
probably easier to understand.
The registered products are identified by the so-called W-Numbers.
The relation between P-Numbers and W-Numbers is illustrated below by
showing the first five entries in the products
table.
pNbr | wNbr | name | exhaustionDeadline | soldoutDeadline | isSalePermission | permission_holder |
---|---|---|---|---|---|---|
38 | 18 | Thiovit Jet | FALSE | 10388 | ||
38 | 18-1 | Sufralo | TRUE | 10712 | ||
38 | 18-2 | Capito Bio-Schwefel | TRUE | 10712 | ||
38 | 18-3 | Sanoplant Schwefel | TRUE | 10388 | ||
38 | 18-4 | Biorga Contra Schwefel | TRUE | 10388 | ||
1182 | 923 | Divopan | FALSE | 10388 |
As can be seen in these example entries, several registrations
(W-Numbers) of the same product type (P-Number) can exist. The W-Numbers
without a dash (e.g. 18
) are the original registrations,
and the ones containing a dash and a trailing number
(e.g. 18-1
, 18-2
) are equivalent products with
sales permissions that have a different legal entity as permission
holder.
If the product registration has been revoked, the relevant latest
dates for selling the product (soldoutDeadline
) and for use
of the product (exhaustionDeadline
) are given in the
respective columns.
current_register$products |>
filter(exhaustionDeadline != "") |>
select(-terminationReason) |>
head() |>
kable()
pNbr | wNbr | name | exhaustionDeadline | soldoutDeadline | isSalePermission | permission_holder |
---|---|---|---|---|---|---|
3726 | 2935 | Polyram DF | 2025-07-01 | 2025-01-01 | FALSE | 10019 |
3726 | 2935-1 | Metiram WG | 2025-07-01 | 2025-01-01 | TRUE | 10213 |
3726 | 2935-2 | Aviso | 2025-07-01 | 2025-01-01 | TRUE | 10050 |
4426 | 4343 | Cypermethrin | 2026-06-11 | 2025-06-11 | FALSE | 10079 |
5166 | 3060 | Etephon Médol | 2026-06-30 | 2025-06-30 | FALSE | 10115 |
6579 | 5530 | Lontrel 100 | 2024-11-30 | 2023-11-30 | FALSE | 10054 |
At the build time of this vignette, there were 1723 product registrations for 1128 P-Numbers in the Swiss Register of Plant Protection Products (SRPPP) as published on the website of the Federal Food Safety and Veterinary Office.
If the name of a product is known, the associated P-Numbers and W-Numbers as well as the product composition can be retrieved by a command like the following.
current_register$products |>
filter(name == "Plüsstar") |>
left_join(current_register$ingredients, by = "pNbr") |>
left_join(current_register$substances, by = "pk") |>
select(pNbr, name, substance_de, percent, g_per_L) |>
kable()
pNbr | name | substance_de | percent | g_per_L |
---|---|---|---|---|
4077 | Plüsstar | 2,4-D | 14.8 | 170 |
4077 | Plüsstar | Mecoprop-P | 35.3 | 405 |
For each product type (P-Number), the registered uses (tagged as
<Indication>
in the XML file) are specified in the
uses
table. The use numbers in the column
use_nr
are generated while reading in the XML file, in
order to be able to refer to each use by a combination of P-Number
(pNbr
) and use number (use_nr
).
current_register$uses |>
filter(pNbr %in% c(6521L, 7511L) & use_nr < 10) |>
select(pNbr, use_nr, ends_with("dosage"), ends_with("rate"), units_de,
waiting_period, time_units_en, application_area_de) |>
head(20) |>
kable()
pNbr | use_nr | min_dosage | max_dosage | min_rate | max_rate | units_de | waiting_period | time_units_en | application_area_de |
---|---|---|---|---|---|---|---|---|---|
6521 | 1 | 1.0 | l/ha | Gemüsebau | |||||
6521 | 2 | 0.5 | 1 | l/ha | Feldbau | ||||
6521 | 3 | 1.0 | l/ha | Feldbau | |||||
6521 | 4 | 1.0 | l/ha | Feldbau | |||||
6521 | 5 | 1.0 | l/ha | Feldbau | |||||
6521 | 6 | 1.0 | l/ha | Feldbau | |||||
6521 | 7 | 1.0 | l/ha | Feldbau | |||||
6521 | 8 | 1.0 | l/ha | 3 | Week(s) | Feldbau | |||
6521 | 9 | 1.0 | l/ha | Feldbau | |||||
7511 | 1 | 0.4 | 4.0 | kg/ha | 3 | Days | Beerenbau | ||
7511 | 2 | 0.2 | 3.2 | kg/ha | 3 | Week(s) | Obstbau | ||
7511 | 3 | 0.3 | 3 | Days | Gemüsebau | ||||
7511 | 4 | 0.3 | 3.0 | kg/ha | 3 | Days | Beerenbau | ||
7511 | 5 | 0.2 | 3.2 | kg/ha | 2 | Week(s) | Obstbau | ||
7511 | 6 | 0.4 | 3 | Days | Beerenbau | ||||
7511 | 7 | 0.3 | 3 | Days | Beerenbau | ||||
7511 | 8 | 0.4 | 4.0 | kg/ha | 3 | Days | Beerenbau | ||
7511 | 9 | 0.3 | kg/ha | 3 | Days | Gemüsebau |
The columns min_dosage
and max_dosage
contain either a range of recommended product concentrations in the
spraying solution in percent, or, if only min_dosage
is
given, the recommended concentration. Similarly, if there is a single
recommended application rate, it is stored in min_rate
.
Only if there is a recommended range of application rates,
max_rate
is given as well. The units of the application
rate are given in the columns starting with units_
. In
addition, a required waiting period before harvest can be specified, as
well as the application area associated with the use.
Application rates in terms of grams of the active substances
contained in the products per hectare can be calculated using the
function application_rate_g_per_ha()
as illustrated in the
example below.
In a first step, some uses
need to be selected and
joined with the information in the ingredients
table. The
names of the active substances can be joined as well.
example_uses <- current_register$products |>
filter(wNbr == "6168") |>
left_join(current_register$uses, by = join_by(pNbr),
relationship = "many-to-many") |>
left_join(current_register$ingredients, by = join_by(pNbr),
relationship = "many-to-many") |>
left_join(current_register$substances, by = join_by(pk)) |>
select(pNbr, name, use_nr,
min_dosage, max_dosage, min_rate, max_rate, units_de,
application_area_de,
substance_de, percent, g_per_L) |>
filter(use_nr %in% c(1:5, 12:17))
kable(example_uses)
pNbr | name | use_nr | min_dosage | max_dosage | min_rate | max_rate | units_de | application_area_de | substance_de | percent | g_per_L |
---|---|---|---|---|---|---|---|---|---|---|---|
7105 | Boxer | 1 | 5.0 | l/ha | Gemüsebau | Prosulfocarb | 78.4 | 800 | |||
7105 | Boxer | 2 | 5.0 | l/ha | Gemüsebau | Prosulfocarb | 78.4 | 800 | |||
7105 | Boxer | 3 | 5.0 | l/ha | Gemüsebau | Prosulfocarb | 78.4 | 800 | |||
7105 | Boxer | 4 | 4.0 | l/ha | Gemüsebau | Prosulfocarb | 78.4 | 800 | |||
7105 | Boxer | 5 | 2.5 | 3.0 | l/ha | Gemüsebau | Prosulfocarb | 78.4 | 800 | ||
7105 | Boxer | 12 | 3.0 | 4.5 | l/ha | Feldbau | Prosulfocarb | 78.4 | 800 | ||
7105 | Boxer | 13 | 2.5 | 5.0 | l/ha | Feldbau | Prosulfocarb | 78.4 | 800 | ||
7105 | Boxer | 14 | 3.0 | 5.0 | l/ha | Feldbau | Prosulfocarb | 78.4 | 800 | ||
7105 | Boxer | 15 | 5.0 | l/ha | Feldbau | Prosulfocarb | 78.4 | 800 | |||
7105 | Boxer | 16 | 4.0 | l/ha | Gemüsebau | Prosulfocarb | 78.4 | 800 | |||
7105 | Boxer | 17 | 2.5 | 5.0 | l/ha | Feldbau | Prosulfocarb | 78.4 | 800 |
Then, the application rates can be calculated for these uses as illustrated below.
application_rate_g_per_ha(example_uses) |>
select(ai = substance_de, app_area = application_area_de,
ends_with("rate"), units_de, rate = rate_g_per_ha) |>
head(n = 14) |>
kable()
ai | app_area | min_rate | max_rate | units_de | rate |
---|---|---|---|---|---|
Prosulfocarb | Gemüsebau | 5.0 | l/ha | 4000 | |
Prosulfocarb | Gemüsebau | 5.0 | l/ha | 4000 | |
Prosulfocarb | Gemüsebau | 5.0 | l/ha | 4000 | |
Prosulfocarb | Gemüsebau | 4.0 | l/ha | 3200 | |
Prosulfocarb | Gemüsebau | 2.5 | 3.0 | l/ha | 2400 |
Prosulfocarb | Feldbau | 3.0 | 4.5 | l/ha | 3600 |
Prosulfocarb | Feldbau | 2.5 | 5.0 | l/ha | 4000 |
Prosulfocarb | Feldbau | 3.0 | 5.0 | l/ha | 4000 |
Prosulfocarb | Feldbau | 5.0 | l/ha | 4000 | |
Prosulfocarb | Gemüsebau | 4.0 | l/ha | 3200 | |
Prosulfocarb | Feldbau | 2.5 | 5.0 | l/ha | 4000 |
In the current SRPPP versions, there are only two culture forms, greenhouse cultivation and field cultivation.
culture_form_de | culture_form_fr | culture_form_it | culture_form_en |
---|---|---|---|
Gewächshaus | serre | Serra | |
Freiland | plein air | Pieno campo |
For specific uses, e.g. for uses number 1
and
2
of product “Boxer” with W-Number 6168
, the
associated culture form and the registered cultures can be listed as
shown below. As each use is typically associated with only one culture
form, the culture form and the actual cultures can be joined to the use
numbers in one step.
current_register$products |>
filter(wNbr == "6168") |>
left_join(current_register$uses, by = "pNbr") |>
filter(use_nr %in% 1:2) |>
left_join(current_register$culture_forms, by = c("pNbr", "use_nr")) |>
select(pNbr, use_nr, ends_with("de")) |>
kable()
pNbr | use_nr | units_de | time_units_de | application_area_de | culture_form_de |
---|---|---|---|---|---|
7105 | 1 | l/ha | Tage | Gemüsebau | Freiland |
7105 | 2 | l/ha | Tage | Gemüsebau | Freiland |
The target organisms for each use can be found in the table
pests
. Example code for retrieving the target organisms for
specific uses is given below.
current_register$pests |>
filter(pNbr == 7105L, use_nr %in% 1:2) |>
select(use_nr, ends_with("de"), ends_with("fr")) |>
kable()
use_nr | pest_de | pest_add_txt_de | pest_fr | pest_add_txt_fr |
---|---|---|---|---|
1 | Einjährige Dicotyledonen (Unkräuter) | dicotylédones annuelles | ||
1 | Einjährige Monocotyledonen (Ungräser) | monocotylédones annuelles | ||
2 | Einjährige Dicotyledonen (Unkräuter) | dicotylédones annuelles | ||
2 | Einjährige Monocotyledonen (Ungräser) | monocotylédones annuelles |
In the calculations of mean application rates for the Swiss National
Risk Indicator (Korkaric et al. 2022,
2023), unique combinations of product, culture, and target
organism were termed “indications”. Note that when using this definition
of indications, each XML section <Indication>
can
describe several indications. The relation between uses
(<Indication>
sections) and indications as defined in
the indicator project is illustrated below.
culture_pest_combinations <- current_register$uses |>
filter(pNbr == 6521L) |>
left_join(current_register$cultures, by = c("pNbr", "use_nr")) |>
left_join(current_register$pests, by = c("pNbr", "use_nr")) |>
select(pNbr, use_nr, application_area_de, culture_de, pest_de)
kable(culture_pest_combinations)
pNbr | use_nr | application_area_de | culture_de | pest_de |
---|---|---|---|---|
6521 | 1 | Gemüsebau | Spargel | Spargelrost |
6521 | 1 | Gemüsebau | Spargel | Blattschwärze der Spargel |
6521 | 2 | Feldbau | Weizen | Gelbrost |
6521 | 3 | Feldbau | Weizen | Septoria-Spelzenbräune (S. nodorum) |
6521 | 4 | Feldbau | Weizen | Ährenfusariosen |
6521 | 5 | Feldbau | Weizen | Echter Mehltau des Getreides |
6521 | 6 | Feldbau | Grasbestände zur Saatgutproduktion | Blattfleckenpilze |
6521 | 6 | Feldbau | Grasbestände zur Saatgutproduktion | Rost der Gräser |
6521 | 7 | Feldbau | Winterroggen | Braunrost |
6521 | 8 | Feldbau | Lupinen | Anthraknose |
6521 | 9 | Feldbau | Lein | Stängelbräune des Leins |
6521 | 9 | Feldbau | Lein | Pasmokrankheit |
6521 | 9 | Feldbau | Lein | Echter Mehltau des Leins |
6521 | 10 | Feldbau | Raps | Erhöhung der Standfestigkeit |
6521 | 10 | Feldbau | Raps | Wurzelhals- und Stengelfäule |
6521 | 11 | Feldbau | Eiweisserbse | Graufäule (Botrytis cinerea) |
6521 | 11 | Feldbau | Eiweisserbse | Rost der Erbse |
6521 | 11 | Feldbau | Eiweisserbse | Brennfleckenkrankheit der Erbse |
6521 | 12 | Gemüsebau | Erbsen | Brennfleckenkrankheit der Erbse |
6521 | 12 | Gemüsebau | Erbsen | Rost der Erbse |
6521 | 12 | Gemüsebau | Erbsen | Graufäule (Botrytis cinerea) |
6521 | 13 | Feldbau | Ackerbohne | Rost der Ackerbohne |
6521 | 13 | Feldbau | Ackerbohne | Braunfleckenkrankheit |
6521 | 14 | Feldbau | Raps | Wurzelhals- und Stengelfäule |
6521 | 15 | Feldbau | Raps | Sclerotinia-Fäule |
In this example, there are 25 such “indications” for the 15 uses.
Sometimes, use specific comments can be found in the
application_comments
table.
current_register$application_comments |>
filter(pNbr == 7105, use_nr %in% 1:2) |>
select(pNbr, use_nr, ends_with("de"), ends_with("fr")) |>
kable()
pNbr | use_nr | application_comment_de | application_comment_fr |
---|---|---|---|
7105 | 1 | 7 Tage nach dem Pflanzen. | 7 jours après la plantation. |
7105 | 2 | 7 Tage nach dem Pflanzen. | 7 jours après la plantation. |
The use conditions for each use are listed in the table
obligations
. In the following example, the column
sw_runoff_points
is selected in the output, as both use
authorisations are conditional on risk mitigation for runoff to surface
water amounting to at least one point.
current_register$obligations |>
filter(pNbr == 7105, use_nr %in% 1:2) |>
select(pNbr, use_nr, code, obligation_de, sw_runoff_points) |>
kable()
pNbr | use_nr | code | obligation_de | sw_runoff_points |
---|---|---|---|---|
7105 | 1 | obligation 692 | Nachbau anderer Kulturen: 16 Wochen Wartefrist. | |
7105 | 1 | N01: Profi Re-entry | Nachfolgearbeiten in behandelten Kulturen: bis 48 Stunden nach Ausbringung des Mittels Schutzhandschuhe + Schutzanzug tragen. | |
7105 | 1 | obligation 1928 | Maximal 1 Behandlung pro Kultur. | |
7105 | 1 | ML01_A04_T01 | Ansetzen der Spritzbrühe: Schutzhandschuhe tragen. Ausbringen der Spritzbrühe: Schutzhandschuhe + Schutzanzug + Visier + Kopfbedeckung tragen. Technische Schutzvorrichtungen während des Ausbringens (z.B. geschlossene Traktorkabine) können die vorgeschriebene persönliche Schutzausrüstung ersetzen, wenn gewährleistet ist, dass sie einen vergleichbaren oder höheren Schutz bieten. | |
7105 | 1 | Abschwemmung 1 Punkt | SPe 3: Zum Schutz von Gewässerorganismen muss das Abschwemmungsrisiko gemäss den Weisungen der Zulassungsstelle um 1 Punkt reduziert werden. | 1 |
7105 | 1 | Splitbehandlung gemäss den Angaben der Bewilligungsinhaberin (max. 3 l/ha je Split, angegebene Aufwandmenge entspricht total bewilligter Menge). | ||
7105 | 1 | obligation 2032 | Phytotoxschäden bei empfindlichen Arten oder Sorten möglich; vor allgemeiner Anwendung Versuchspritzung durchführen. | |
7105 | 1 | Bewilligt nach Art. 35 PSMV (minor use). | Bewilligt als geringfügige Verwendung nach Art. 35 PSMV (minor use). | |
7105 | 2 | Abschwemmung 1 Punkt | SPe 3: Zum Schutz von Gewässerorganismen muss das Abschwemmungsrisiko gemäss den Weisungen der Zulassungsstelle um 1 Punkt reduziert werden. | 1 |
7105 | 2 | obligation 692 | Nachbau anderer Kulturen: 16 Wochen Wartefrist. | |
7105 | 2 | N01: Profi Re-entry | Nachfolgearbeiten in behandelten Kulturen: bis 48 Stunden nach Ausbringung des Mittels Schutzhandschuhe + Schutzanzug tragen. | |
7105 | 2 | ML01_A04_T01 | Ansetzen der Spritzbrühe: Schutzhandschuhe tragen. Ausbringen der Spritzbrühe: Schutzhandschuhe + Schutzanzug + Visier + Kopfbedeckung tragen. Technische Schutzvorrichtungen während des Ausbringens (z.B. geschlossene Traktorkabine) können die vorgeschriebene persönliche Schutzausrüstung ersetzen, wenn gewährleistet ist, dass sie einen vergleichbaren oder höheren Schutz bieten. | |
7105 | 2 | obligation 1928 | Maximal 1 Behandlung pro Kultur. | |
7105 | 2 | obligation 2032 | Phytotoxschäden bei empfindlichen Arten oder Sorten möglich; vor allgemeiner Anwendung Versuchspritzung durchführen. | |
7105 | 2 | Splitbehandlung gemäss den Angaben der Bewilligungsinhaberin (max. 3 l/ha je Split, angegebene Aufwandmenge entspricht total bewilligter Menge). | ||
7105 | 2 | Bewilligt nach Art. 35 PSMV (minor use). | Bewilligt als geringfügige Verwendung nach Art. 35 PSMV (minor use). |