Provides dry-matter, nutrient, and energy conversion coefficients for agricultural products and residues. Used to convert fresh-matter production quantities into biomass flows, nutrient budgets, and energy content.
Format
A tibble where each row corresponds to one product or item. It contains 63 columns:
Code: Item code (character), corresponding to FAOSTAT production codes.Name_biomass: Item name as used in biomass accounting.Equiv: Reference equivalence item used when coefficients are borrowed from another similar commodity (e.g.,"Wheat"for oats).Category: Broad commodity category (e.g.,"Cereals, other","Barley","Vegetables").Product_kgDM_kgFM: Product dry-matter content in kg DM per kg fresh matter.Residue_kgDM_kgFM: Residue dry-matter content in kg DM per kg fresh matter of product.Conventional_kgDM_ha: Conventional yield in kg dry matter per hectare.Organic_kgDM_ha: Organic yield in kg dry matter per hectare.GE_product_edible_portion_MJ_kgFM: Gross energy of the edible portion in MJ per kg fresh matter.GE_product_residue_MJ_kgFM: Gross energy of the residue in MJ per kg fresh matter (may be character due to source formatting).GE_product_MJ_kgFM: Gross energy of the whole product in MJ per kg fresh matter.GE_residue_MJ_kg: Gross energy of the residue in MJ per kg.kg_product_kg_aerial_biomass: Fraction of aerial biomass that is product (harvest index, kg/kg).kg_residue_kg_aerial_biomass_FM: Fraction of aerial biomass that is residue, on fresh matter basis.kg_residue_kg_product_FM: Ratio of residue to product on fresh matter basis.Carcass_to_LW: Carcass-to-live-weight ratio (livestock only; logical placeholder for crop items).Edible_portion: Edible fraction of the product (kg edible / kg fresh matter).N_kgN_kgFM: Nitrogen content in kg N per kg fresh matter.Lipids_g_kgFM: Lipid content in g per kg fresh matter.Carbohydrates_g_kgFM: Carbohydrate content in g per kg fresh matter.Calcium_mg_kgFM: Calcium content in mg per kg fresh matter.VitaminA_microg_kgFM: Vitamin A content in micrograms per kg fresh matter.
N_kgN_kgFM is the food-composition nitrogen density of the edible part,
and is what build_food_supply() turns into protein. Its provenance is
weak and worth knowing before trusting a row. Upstream it sits under the
NUTRIENTS IN EDIBLE PART group header with the four columns above, but
the workbook's Sources sheet has no column for any of the five: its
columns run from kg_residue_kg_product_FM straight to
Product_kgN_kgDM, so the whole nutrition block is undocumented at source
(#500 section 6, #1074). Most rows are a VLOOKUP into the workbook's
food-composition sheet Conversores_Dieta, the same sheet that fills the
four columns above; that sheet derives its own nitrogen column as
Proteinas / (6.25 * 1000). The derivation is missing for exactly its five
cereal rows – Wheat, Oats, Rye, Maize and Rice – which carry
a Proteinas value but no nitrogen, so for those five the lookup was
replaced by the agronomic Product_kgN_kgDM * Product_kgDM_kgFM. Other
rows, Vegetables, other, Olive and Honey among them, hold a bare
literal. Those eight are the ones #1096 tracks; what became of each is
below.
Wheat was the largest consequence. It carried 0.018951324393104405 kg N
per kg, 118.45 g of protein per kg at N x 6.25, which is exactly
Product_kgN_kgDM * Product_kgDM_kgFM – the agronomic whole-grain
nitrogen the Sources sheet attributes to FEDNA 2016, a feed table.
Applied to a commodity-balance food quantity that is the wheat-grain
equivalent of the milled products people eat, that counts the bran and germ
protein milling diverts away from food.
It now carries 0.01488 kg N per kg, i.e. 93 g of protein per kg: the
flour basis. The value is read from the workbook cell, not recalled:
Biomass_coefs.xlsx, sheet Conversores_Dieta, row 4, labelled
Harina de Trigo (wheat flour) and keyed to Name_biomass = "Wheat",
column Proteinas = 93 g/kg. That row is where this table already takes
the wheat lipids (12 g/kg), carbohydrates (800 g/kg), calcium (150 mg/kg)
and vitamin A (0) from – all four ship today – so the wheat nutrition
block was flour composition everywhere except protein, and the change makes
the row internally consistent rather than importing a foreign number.
Neither 118.45 nor 93 has a Sources entry, so 93 is corroborated, not
cited upstream. What "flour basis" means numerically is protein per kg of
grain equivalent, which is flour protein times the milling extraction
rate, so the published tables were read on that basis:
FAO, Food composition tables for international use, 2nd ed., Rome, 1953, https://www.fao.org/4/x5557e/x5557e04.htm (FAO flags it as historical). Medium wheat: whole meal 12.2 g/100 g at 100% extraction, flour 11.7 at 85%, 10.9 at 72% – so 99.4 and 78.5 g per kg of grain equivalent, which bracket 93.
USDA FoodData Central 168894 (SR Legacy), "Wheat flour, white, all-purpose, enriched, bleached": protein 10.33 g/100 g, so 103.3 g per kg of flour, 72-88 g per kg of grain equivalent at 70-85% extraction.
FAO, Technical conversion factors for agricultural commodities, Rome, https://www.fao.org/fileadmin/templates/ess/documents/methodology/tcf.pdf – its per-country
Flour of Wheatextraction rates run 70-97% with a median of 75%, which is why no single flour figure maps to one grain-equivalent density.
The oracle is FAOSTAT FBS itself, which builds its protein the same way:
composition factors on the products eaten, over the standardised
primary-equivalent quantity that WHEP's food_t also is (FAO, Food
balance sheets: a handbook, section III,
https://www.fao.org/4/X9892E/X9892e03.htm). For item 2511 its World
row (area 5000) implies 91.71-93.15 g/kg over 2010-2023, 92.99 in 2010;
summed instead over the 171 countries reporting both elements it is
94.96-96.90, 96.60 in 2010. So 93 lands within 0.02% of the World row and
3.7% below the country sum, where 118.45 was above both: 27.4% above the
World row and 22.6% above the country sum (whep#796).
One global coefficient cannot carry the extraction pattern country by
country: FBS's own per-country implied density for 2511 in 2010 spans
41-115 g/kg (q10 69, median 81, q90 90), so 93 is the mass-weighted world
point of that distribution and leaves the median country high. The previous
value stays selectable as
build_food_supply(protein_basis = "product_nitrogen"), which reads the
agronomic route directly and returns exactly 0.11844577745690253 kg protein
per kg; the choice is recorded per row in method_protein_basis.
The other seven rows were settled one by one (#1096), by the same test as
wheat: does the row's own Conversores_Dieta entry, the one that already
fills its other nutrients, carry a protein value, and does following it
agree with the FBS oracle? The oracle ratios below are WHEP world food
protein over the FBS World row (area 5000), 2010, on a real build.
Olivenow carries 0.00128 (8 g protein/kg), from row 39Aceituna de mesa(table olive), whose lipids 200, carbohydrates 10, calcium 630, vitamin A 220 and edible portion 0.8 are the values already shipped. The bare literal 0.0038 it replaces put olive protein at 3.23x FBS; at 0.00128 it is 1.09x.Ryenow carries 0.016 (100 g/kg), from row 6Harina de Centeno(rye flour), whose lipids 19.3, carbohydrates 597 and calcium 270 are already shipped – the wheat case exactly, flour basis. The agronomic 0.01367 it replaces was 0.90x FBS; 0.016 is 1.06x.Honeynow carries 0.0008 (5 g/kg), carbohydrates 780 g/kg and calcium 50 mg/kg, from row 36Miel. Its block had been a hand-typed placeholder (protein 0, carbohydrate 1000 g/kg, calcium 0) that matched no row and put 1000 g of carbohydrate in 785 g of dry matter; protein and carbohydrate fromMielsum to exactly that dry matter. At 5 g/kg honey is 1.69x FBS, where it was zero. Only the protein moves a computed number: nothing in the package reads the carbohydrate or calcium columns.OatsandMaizeare unchanged, on the agronomic value. Their rows, 5Avena grano117 g/kg and 7Harina de Maiz87 g/kg, move away from the FBS density (72.6 and 62.2 g/kg, country sum) where the agronomic 83.8 and 78.0 are closer, so following the row would be consistency at the cost of accuracy. Open for an expert.Riceis unchanged: its basis was settled in #751/#755.Vegetables, otheris unchanged and moves no food number: noitem_cbs_codebridges to it (Vegetables, Other2605 reachesArtichokethroughitems_full). Its row 113 would give 33.3 g/kg against the literal's 14.0, and neither is checked.
All three new values are the workbook's own composition figures, which,
like the rest of this block, have no Sources entry: they are corroborated
by the FBS oracle, not cited upstream. The workbook copy read was
afsetools/inst/extdata/Biomass_coefs.xlsx; upstream still carries the old
values in Coefs and should follow.
The tree-nut rows Almonds, Walnut and Hazelnut pair a kernel
nitrogen density with an Edible_portion that now refers to the nut in
shell (whep#797). FBS item 2551 Nuts and products is a quantity in
shell, and it reaches Almonds through items_full; with an
Edible_portion of 1 the shell was counted as food, 200 g of protein per
kg against an FBS density of 46.6, 4.3x. The edible fraction is FAO's own
food-composition factor for the FBS, in-shell protein over shelled
protein per 100 g (FAO, Food balance sheets: a handbook, Rome, 2001,
Annex I, https://www.fao.org/docrep/pdf/011/x9892e/x9892e00.pdf, PDF
page 65): almonds 8.0 / 20.0 = 0.4, walnuts 6.4 / 14.3 = 0.4476,
hazelnuts 6.0 / 13.0 = 0.4615. The shelled figures are this table's
own kernel densities to within 8% (20.0, 14.0, 14.1 g/100 g). FAO's
Technical conversion factors for agricultural commodities
(https://www.fao.org/fileadmin/templates/ess/documents/methodology/tcf.pdf)
corroborates the range: its per-country shelled-from-unshelled extraction
rates run 30-65% for almonds (median 35), 35-70% for walnuts (median 40) and
40-50% for hazelnuts (median 50). Nuts now carry 80 g of protein per kg,
1.7x FBS. What remains is the basket: 2551 covers ten species and FAO's
in-shell factors for them run from 1.8 (chestnuts) to 10.3 (pistachios),
so one representative species cannot match it (whep#1453). Only the
protein moves: the energy columns are not scaled by Edible_portion.
The ten Edible_* and NonEdible_* nutrient columns below are empty in
every row, upstream in the source workbook as well as here, so no
edible/non-edible nutrient split can be read from them (#361). Use
Edible_portion with N_kgN_kgFM or Product_kgN_kgDM to derive an edible
basis instead, as build_food_supply() does.
Edible_kgDM_kgFM: Edible dry matter in kg per kg fresh matter. Empty.Edible_kgC_kgFM: Edible carbon in kg C per kg fresh matter. Empty.Edible_N_kgFM: Edible nitrogen in kg N per kg fresh matter. Empty.Edible_kgP_kgFM: Edible phosphorus in kg P per kg fresh matter. Empty.Edible_K_kgFM: Edible potassium in kg K per kg fresh matter. Empty.NonEdible_kgDM_kgFM: Non-edible dry matter, kg per kg fresh matter. Empty.NonEdible_kgC_kgFM: Non-edible carbon in kg C per kg fresh matter. Empty.NonEdible_kgN_kgFM: Non-edible nitrogen in kg N per kg fresh matter. Empty.NonEdible_kgP_kgFM: Non-edible phosphorus, kg P per kg fresh matter. Empty.NonEdible_kgK_kgFM: Non-edible potassium, kg K per kg fresh matter. Empty.Product_kgN_kgDM: Nitrogen content of product in kg N per kg dry matter.
The synthetic feed-additive rows take this column from the FEDNA feed
tables as crude protein divided by 6.25, the same way Threonine,
Tryptophan, Valine and Urea still do. Methionine carried 0.1143
instead, which is 21.7% above the most nitrogen the molecule can hold:
methionine is C5H11NO2S with one nitrogen atom, so its mass fraction is
14.007 over 149.208, or 0.0939 kg N per kg. It is now FEDNA's DL-Metionina
entry, 58.5% crude protein and better than 99% purity, giving 0.0936
(whep#931; https://fundacionfedna.org/ingredientes-para-piensos).
The alternative is the other commercial methionine source,
the hydroxy analogue FEDNA lists as HIDROXI-ANAL MET, which is C5H10O3S
and holds no nitrogen at all; it is the value the retired pin carried.
That items_full$FEDNA names HIDROXI-ANAL MET for this item is not
evidence for the analogue: that column is a feed-table stand-in, not a
product identity (see items_full, whep#1131).
The upstream workbook records no source for the 28 feed-additive rows, so
their provenance is kept in
inst/extdata/harmonization/biomass_coefs_additive_sources.csv, one row per
additive with the entry it was read from in the FEDNA 2019 tables
(Tablas FEDNA 2019.xlsx, v. 15.01.2021, linked from
https://fundacionfedna.org/ingredientes-para-piensos) or an explicit
"assumed, unverified" status (whep#1074). Lysine is
FEDNA's L-Lisina HCl, 94.4% crude protein, 0.1510; it carried 0.2015,
above even the free base's 0.1916. Ammonium chloride is FEDNA's Cloruro
amonico, 163.6% crude protein, 0.2618. Choline chloride is FEDNA's
Cloruro colina 60, whose 52% choline gives 0.0699 through the choline
cation's nitrogen fraction, 14.007 over 104.173; FEDNA books its crude
protein as zero because choline nitrogen is not protein, not because it is
absent. Both carried 0, so their nitrogen was missing from the balance.
Phytase and Enzimes keep an unsourced 0.116, now marked as assumed;
their fresh-matter N_kgN_kgFM of 0.16 now follows this column.
Product_kgP_kgDM: Phosphorus content of product in kg P per kg dry matter.Product_kgK_kgDM: Potassium content of product in kg K per kg dry matter.Product_kgC_kgDM: Carbon content of product in kg C per kg dry matter.Residue_kgN_kgDM: Nitrogen content of residue in kg N per kg dry matter.
For the wood and forest rows this column prices two physically different
quantities through one cell. create_n_prov_destiny() sends the harvested
Wood item to Average wood, and also relabels the residue production of
forest and shrubland land as Firewood, which resolves to the same row.
Harvested wood is stemwood; forest residue is branches, bark and foliage.
The shipped value is assumed, unverified. No value the upstream
workbook has carried for these rows has a citation that can be opened: the
beech anchor's source cell begins ChatGPT., the conifer anchor's two
citations do not resolve as written, and the holm-oak anchor's cell is
blank (whep#932). The anchors can still be placed against an independent
compilation. Thurner et al. (2025) pool 1048 stem, 599 branch, 267 root and
5944 leaf nitrogen measurements for boreal and temperate trees – the woody
ones almost entirely from 192 literature studies – and report medians, in
kg N per kg dry matter, of 0.0010 in stem sapwood, 0.0035 in branches,
0.0060 in roots and 0.0167 in leaves. Against
those, Average wood's 0.0030 is 0.86 of the branch median and 3.0 times
the stem median – a branch concentration – while the retired pin's
0.00095 is 0.95 of the stem median, a stemwood one.
So the gap whep#932 records is not two estimates of one quantity in
disagreement; it is the 3.5-fold gap between stem and branch tissue, and
whichever single number the cell carries is wrong by about that factor for
one of its two uses. The same ordering appears in the trembling-aspen
budget of Morrison and Foster (1979, reproduced in Hacker 2005, "Effects of
Logging Residue Removal on Forest Sites"), where stemwood holds 84 kg N in
119 t of dry matter, 0.00071 kg N per kg, against 0.0042 for bark, 0.0049
for branches and 0.024 for foliage. So this cell is left as published and
create_n_prov_destiny() does not read it for wood by default: with
wood_n_method = "tissue" it prices Wood at the stem median 0.0010 and
Firewood at the branch median 0.0035 (whep#932); "single" reads this
cell for both. tests/testthat/test_biomass_coefs_wood_provenance.R holds
the comparison and fails if either side of it drifts.
Thurner, M., Yu, K., Manzoni, S., Prokushkin, A., Thurner, M. A., Wang, Z., and Hickler, T. (2025). Nitrogen concentrations in boreal and temperate tree tissues vary with tree age/size, growth rate, and climate. Biogeosciences 22(5), 1475-1493. doi:10.5194/bg-22-1475-2025 .
Residue_kgP_kgDM: Phosphorus content of residue in kg P per kg dry matter.Residue_kgK_kgDM: Potassium content of residue in kg K per kg dry matter.Residue_kgC_kgDM: Carbon content of residue in kg C per kg dry matter.Residue_humified_kgC_kgC: Humification coefficient of residue carbon (fraction of residue C stabilised as soil organic matter).MgDM_m3: Megagrams dry matter per cubic metre (bulk density proxy).Root_humified_kgC_kgC: Humification coefficient for root carbon.Root_mass_kgC_kgDM: Root carbon mass in kg C per kg crop dry matter.Residue_C_N: Carbon-to-nitrogen ratio of the residue.Root_kgN_kgDM: Nitrogen content of roots in kg N per kg root dry matter.GE_Roots_MJ_kgDM: Gross energy of roots in MJ per kg dry matter.Fiber_g_kgFM: Dietary fibre content in g per kg fresh matter.SFA_g_kgFM: Saturated fatty acid content in g per kg fresh matter.MUFA_g_kgFM: Monounsaturated fatty acid content in g per kg fresh matter.PUFA_g_kgFM: Polyunsaturated fatty acid content in g per kg fresh matter.PUFA_n3_g_kgFM: Omega-3 PUFA content in g per kg fresh matter.Iron_mg_kgFM: Iron content in mg per kg fresh matter.Zinc_mg_kgFM: Zinc content in mg per kg fresh matter.Magnesium_mg_kgFM: Magnesium content in mg per kg fresh matter.Cadmium_microg_kgFM: Cadmium content in micrograms per kg fresh matter.VitaminB12_microg_kgFM: Vitamin B12 content in micrograms per kg fresh matter.VitaminD_microg_kgFM: Vitamin D content in micrograms per kg fresh matter.Folate_microg_kgFM: Folate content in micrograms per kg fresh matter.VitaminC_mg_kgFM: Vitamin C content in mg per kg fresh matter.VitaminE_mg_kgFM: Vitamin E content in mg per kg fresh matter.Flavonoids_mg_kgFM: Flavonoid content in mg per kg fresh matter.Carotenoids_mg_kgFM: Carotenoid content in mg per kg fresh matter.
Source
Compiled from multiple sources including FAO food composition data, crop physiology literature, and IPCC Tier 1 coefficients.
Details
This is the single source of biomass coefficients in the package. Until
#489 a biomass_coefs pin frozen at 20250728T082553Z was also readable
through whep_read_file(); it was a narrowed 2025 export that disagreed
with this table on 12 of their 36 shared columns, so the same commodity
carried different nitrogen coefficients depending on which path read it.
The pin has been retired and all callers now read this dataset.
Five runtime-dead below-ground fields were retired from this legacy table:
BG_Biomass_kgDM_ha, Root_Shoot_ratio, Root_kgC_kgDM,
Rhizodeposits_mass_kgC_kgDM, and Rhizodeposits_N_kgN_kgRootN. Their
related item-keyed fields in bio_coefs are, respectively,
bg_biomass_dm_kg_ha, root_shoot_ratio, root_c_kgdm,
rhizodeposit_mass_c_kgdm, and rhizodeposit_n_kgn_krootn. This is not a
universal one-to-one row mapping. calculate_crop_roots() uses
ipcc_root_coefs$bg_ref_dm_t_ha and ipcc_root_coefs$rs_default when they
are available, with the corresponding bio_coefs fields as fallbacks.
root_c_kgdm and rhizodeposit_n_kgn_krootn are direct calculation inputs.
rhizodeposit_mass_c_kgdm is an integrity and documentation component that
is already included in root_c_kgdm, rather than a separate runtime input.
Three all-caps rows of the source spreadsheet are section headers rather
than commodities and are dropped at ingestion (#752): TRANSFORMED PRODUCTS and AGRO-INDUSTRY BYPRODUCTS are empty, and ANIMAL PRODUCTS
holds the VLOOKUP column-index vector the upstream Coefs sheet addresses
by absolute position, which read as data claims an Edible_portion of 4.
The Aquatic Plants row is WHEP's own, not the upstream workbook's, which
has no seaweed row: items_full bridged CBS item 2775 to a placeholder
name that matched nothing, so its feed mass dropped out of feed
availability and its food mass carried no protein or energy (whep#970).
Two sources fill it, one per use:
Food (
N_kgN_kgFM,GE_product_MJ_kgFM,Lipids_g_kgFM,Edible_portion): FAO's own composition factor for the item, read from FAO, Food balance sheets: a handbook, Rome, 2001, Annex I "Food composition in terms of retail weight", rowAQUATIC PLANTS, PDF page 68 (printed 64), https://www.fao.org/docrep/pdf/011/x9892e/x9892e00.pdf: 54 kcal, 2.8 g protein and 0.6 g fat per 100 g of the commodity as recorded, i.e. fresh. So nitrogen is 2.8 / 100 / 6.25 = 0.00448 kg per kg, the energy cell holds 540 kcal, 2.25936 MJ, per kg, andEdible_portionis 1 because FAO applies the factor to the recorded quantity directly. The energy is FAO's dietary energy, not bomb-calorimeter gross energy: it is whatbuild_food_supply()turns intoenergy_kcal_cap_day, against FBS element 664. Oracle: FAOSTAT FBS item 2775, World (area 5000), 2010, implies 26.5 g protein per kg (element 671 over element 5142), 5.5% below the 2001 factor; and 372 kcal per kg, so current FBS uses a lower energy factor than the 2001 table.Feed (
Product_kgDM_kgFM,Product_kgN_kgDM): Heuze, V., Tran, G., Giger-Reverdin, S., Lessire, M. and Lebas, F. (2017), Seaweeds (marine macroalgae), Feedipedia, INRAE, CIRAD, AFZ and FAO, https://feedipedia.org/node/78, table "Laminaria and Saccharina seaweeds" (fresh): dry matter 15.4% as fed (SD 3.6, range 9.7-22.5, n = 56), crude protein 9.8% of DM (n = 50), so 0.01568 kg N per kg DM. It is the only fresh-seaweed table on that page; the others are dried meals at 85-93% DM, which would put fresh mass at nearly its own dry weight.
The two disagree on nitrogen per kg of fresh matter – 0.00448 against
0.154 x 0.01568 = 0.00241 – because FAO's factor covers the whole
aquatic-plant basket and Feedipedia's table covers kelps only. Protein
differs widely across that basket: McHugh, D. J. (2003), A guide to the
seaweed industry, FAO Fisheries Technical Paper 441, chapter 8,
https://www.fao.org/4/y4765e/y4765e0b.htm, puts nori (Porphyra) at
30-50% protein and Laminaria at about 10%. Each value is kept on the use
it was published for. Product_kgC_kgDM and the remaining columns are
left empty: no source was read for them.
Examples
head(biomass_coefs)
#> # A tibble: 6 × 63
#> Code Name_biomass Equiv Category Product_kgDM_kgFM Residue_kgDM_kgFM
#> <chr> <chr> <chr> <chr> <dbl> <dbl>
#> 1 75 Oats Wheat Cereals, other 0.867 0.907
#> 2 44 Barley Wheat Barley 0.885 0.864
#> 3 27 Rice NA Rice 0.864 0.91
#> 4 79 Millet Maize Cereals, other 0.880 0.9
#> 5 71 Rye NA Cereals, other 0.876 0.924
#> 6 83 Sorghum Maize Cereals, other 0.865 0.87
#> # ℹ 57 more variables: Conventional_kgDM_ha <dbl>, Organic_kgDM_ha <dbl>,
#> # GE_product_edible_portion_MJ_kgFM <dbl>, GE_product_residue_MJ_kgFM <dbl>,
#> # GE_product_MJ_kgFM <dbl>, GE_residue_MJ_kg <dbl>,
#> # kg_product_kg_aerial_biomass <dbl>, kg_residue_kg_aerial_biomass_FM <dbl>,
#> # kg_residue_kg_product_FM <dbl>, Carcass_to_LW <lgl>, Edible_portion <dbl>,
#> # N_kgN_kgFM <dbl>, Lipids_g_kgFM <dbl>, Carbohydrates_g_kgFM <dbl>,
#> # Calcium_mg_kgFM <dbl>, VitaminA_microg_kgFM <dbl>, …
