Skip to contents

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.

Usage

biomass_coefs

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 Wheat extraction 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.

  • Olive now carries 0.00128 (8 g protein/kg), from row 39 Aceituna 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.

  • Rye now carries 0.016 (100 g/kg), from row 6 Harina 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.

  • Honey now carries 0.0008 (5 g/kg), carbohydrates 780 g/kg and calcium 50 mg/kg, from row 36 Miel. 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 from Miel sum 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.

  • Oats and Maize are unchanged, on the agronomic value. Their rows, 5 Avena grano 117 g/kg and 7 Harina de Maiz 87 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.

  • Rice is unchanged: its basis was settled in #751/#755.

  • Vegetables, other is unchanged and moves no food number: no item_cbs_code bridges to it (Vegetables, Other 2605 reaches Artichoke through items_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", row AQUATIC 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, and Edible_portion is 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 what build_food_supply() turns into energy_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>, …