NutrienTrackeR

Tiana Ho

What is NutrienTrackeR?

  • A tool set for food information and dietary assessment
  • Uses food composition data from 5 country databases:
    • USDA (United States)
    • CIQUAL (France)
    • CNF (Canada)
    • BEDCA (Spain)
    • STFCJ (Japan)
  • Compares intake against NIH Recommended Dietary Allowances (RDA)
  • Available on CRAN

Installation & Functions

Code
install.packages("NutrienTrackeR")
library(NutrienTrackeR)
Function Purpose
findFoodName() Search foods by keyword
getNutrientNames() List all tracked nutrients
dietBalance() Calculate daily nutrient intake vs RDA
nutrientIntakePlot() Visualize intake vs recommendations
nutrientPiePlot() See which foods drive a nutrient
nutrientsTimeTrend() Track nutrients over a week
NutrienTrackeRapp() Interactive Shiny app

The Data Structure

# USDA 
usda <- food_composition_data$USDA
dim(usda) # rows = foods, cols = nutrients
[1] 7754   47
usda[1:5, 1:10] # first 5 foods, first 10 nutrients
     food_id food_name                    food_group               food_db   
1001 " 1001" "Butter, salted"             "Dairy and Egg Products" "USDA(SR)"
1002 " 1002" "Butter, whipped, with salt" "Dairy and Egg Products" "USDA(SR)"
1003 " 1003" "Butter oil, anhydrous"      "Dairy and Egg Products" "USDA(SR)"
1004 " 1004" "Cheese, blue"               "Dairy and Egg Products" "USDA(SR)"
1005 " 1005" "Cheese, brick"              "Dairy and Egg Products" "USDA(SR)"
     Water (g) Energy (kcal) Protein (g) Total lipid (fat) (g) Ash (g)
1001 "15.87"   "717"         "0.85"      "81.11"               "2.11" 
1002 "16.72"   "718"         "0.49"      "78.3"                "1.62" 
1003 "0.24"    "876"         "0.28"      "99.48"               "0"    
1004 "42.41"   "353"         "21.4"      "28.74"               "5.11" 
1005 "41.11"   "371"         "23.24"     "29.68"               "3.18" 
     Carbohydrate, by difference (g)
1001 "0.06"                         
1002 "2.87"                         
1003 "0"                            
1004 "2.34"                         
1005 "2.79"                         

Function 1: findFoodName()

We have to verify exact food names BEFORE building the diet.

# Search for tuna in USDA
findFoodName("tuna", food_database = "USDA")
                                                                                                     15117 
                                                                         "Fish, tuna, fresh, bluefin, raw" 
                                                                                                     15118 
                                                            "Fish, tuna, fresh, bluefin, cooked, dry heat" 
                                                                                                     15119 
                                                        "Fish, tuna, light, canned in oil, drained solids" 
                                                                                                     15121 
"Fish, tuna, light, canned in water, drained solids (Includes foods for USDA's Food Distribution Program)" 
                                                                                                     15123 
                                                                        "Fish, tuna, fresh, skipjack, raw" 
                                                                                                     15124 
                                                        "Fish, tuna, white, canned in oil, drained solids" 
                                                                                                     15126 
                                                      "Fish, tuna, white, canned in water, drained solids" 
                                                                                                     15127 
                                                                       "Fish, tuna, fresh, yellowfin, raw" 
                                                                                                     15128 
                                                                                        "Fish, tuna salad" 
                                                                                                     15183 
                                          "Fish, tuna, light, canned in oil, without salt, drained solids" 
                                                                                                     15184 
                                        "Fish, tuna, light, canned in water, without salt, drained solids" 
                                                                                                     15185 
                                          "Fish, tuna, white, canned in oil, without salt, drained solids" 
                                                                                                     15186 
                                        "Fish, tuna, white, canned in water, without salt, drained solids" 
                                                                                                     15220 
                                                           "Fish, tuna, skipjack, fresh, cooked, dry heat" 
                                                                                                     15221 
                                                          "Fish, tuna, yellowfin, fresh, cooked, dry heat" 
                                                                                                     21126 
                             "Fast foods, submarine sandwich, tuna on white bread with lettuce and tomato" 
                                                                                                     21214 
                                                 "SUBWAY, tuna sub on white bread with lettuce and tomato" 

Function 2: getNutrientNames()

# Check all the nutrients tracked in USDA 
getNutrientNames(food_database = "USDA")
 [1] "Water (g)"                             
 [2] "Energy (kcal)"                         
 [3] "Protein (g)"                           
 [4] "Total lipid (fat) (g)"                 
 [5] "Ash (g)"                               
 [6] "Carbohydrate, by difference (g)"       
 [7] "Fiber, total dietary (g)"              
 [8] "Sugars, total (g)"                     
 [9] "Calcium, Ca (mg)"                      
[10] "Iron, Fe (mg)"                         
[11] "Magnesium, Mg (mg)"                    
[12] "Phosphorus, P (mg)"                    
[13] "Potassium, K (mg)"                     
[14] "Sodium, Na (mg)"                       
[15] "Zinc, Zn (mg)"                         
[16] "Copper, Cu (mg)"                       
[17] "Manganese, Mn (mg)"                    
[18] "Selenium, Se (ug)"                     
[19] "Vitamin C, total ascorbic acid (mg)"   
[20] "Thiamin (mg)"                          
[21] "Riboflavin (mg)"                       
[22] "Niacin (mg)"                           
[23] "Pantothenic acid (mg)"                 
[24] "Vitamin B-6 (mg)"                      
[25] "Folate, DFE (ug)"                      
[26] "Choline, total (mg)"                   
[27] "Vitamin B-12 (ug)"                     
[28] "Vitamin A, IU (IU)"                    
[29] "Vitamin A, RAE (ug)"                   
[30] "Retinol (ug)"                          
[31] "Alpha-carotene (ug)"                   
[32] "Beta-carotene (ug)"                    
[33] "BetaCrypt (ug)"                        
[34] "Lycopene (ug)"                         
[35] "Lut+Zea (ug)"                          
[36] "Vitamin E (alpha-tocopherol) (mg)"     
[37] "Vitamin D (D2 + D3) (ug)"              
[38] "Vitamin D (IU)"                        
[39] "Vitamin K (phylloquinone) (ug)"        
[40] "Fatty acids, total saturated (g)"      
[41] "Fatty acids, total monounsaturated (g)"
[42] "Fatty acids, total polyunsaturated (g)"
[43] "Cholesterol (mg)"                      

How the diet input works

dietBalance() requires a matrix with two columns:

  • "food" -> exact food name from the database
  • "units" -> grams eaten ÷ 100
Code
# Sample diet
day1 <- matrix(
  c(
    "Cereals, QUAKER, Quick Oats, Dry",                                              "1.0",
    "Oranges, raw, California, valencias",                                           "0.75",
    "Yogurt, plain, low fat",                                                        "1.0",
    "Egg, whole, cooked, hard-boiled",                                               "1.5",
    "Bananas, raw",                                                                  "1.0",
    "Fish, tuna, white, canned in oil, drained solids",                              "1.0",
    "Bread, multi-grain (includes whole-grain)",                                     "1.0",
    "Potatoes, flesh and skin, raw",                                                 "1.0",
    "Mushrooms, portabella, grilled",                                                "0.85",
    "Apples, raw, with skin (Includes foods for USDA's Food Distribution Program)", "1.0"
  ),
  ncol = 2, byrow = TRUE,
  dimnames = list(NULL, c("food", "units"))
)

head(day1, 10)
      food                                                                          
 [1,] "Cereals, QUAKER, Quick Oats, Dry"                                            
 [2,] "Oranges, raw, California, valencias"                                         
 [3,] "Yogurt, plain, low fat"                                                      
 [4,] "Egg, whole, cooked, hard-boiled"                                             
 [5,] "Bananas, raw"                                                                
 [6,] "Fish, tuna, white, canned in oil, drained solids"                            
 [7,] "Bread, multi-grain (includes whole-grain)"                                   
 [8,] "Potatoes, flesh and skin, raw"                                               
 [9,] "Mushrooms, portabella, grilled"                                              
[10,] "Apples, raw, with skin (Includes foods for USDA's Food Distribution Program)"
      units 
 [1,] "1.0" 
 [2,] "0.75"
 [3,] "1.0" 
 [4,] "1.5" 
 [5,] "1.0" 
 [6,] "1.0" 
 [7,] "1.0" 
 [8,] "1.0" 
 [9,] "0.85"
[10,] "1.0" 

Function 3: dietBalance() - analyze the diet

Code
results <- dietBalance(
  my_daily_food  = day1,
  food_database  = "USDA",
  age            = 21,
  gender         = "female",
  summary_report = TRUE
)
                              nutrient proportion(%RDA)         group
1                            Water (g)         25.51356 macronutrient
2                     Calcium, Ca (mg)         46.75500       mineral
3                    Potassium, K (mg)         58.29149       mineral
4                        Iron, Fe (mg)         62.51111       mineral
5                      Sodium, Na (mg)         70.22333       mineral
6       Vitamin K (phylloquinone) (ug)         17.38889       vitamin
7             Vitamin D (D2 + D3) (ug)         23.70000       vitamin
8    Vitamin E (alpha-tocopherol) (mg)         33.03333       vitamin
9                  Vitamin A, RAE (ug)         36.78571       vitamin
10                    Folate, DFE (ug)         68.10000       vitamin
11 Vitamin C, total ascorbic acid (mg)         93.70000       vitamin
            nutrient proportion(%RDA)   group
1 Magnesium, Mg (mg)         157.2742 mineral

Function 4: nutrientIntakePlot()

Code
nutrientIntakePlot(daily_intake = results)

Function 5: nutrientPiePlot()

Which foods drive each nutrient?

Code
nutrientPiePlot(daily_intake = results,
                nutrient = "Protein (g)")

Function 6: nutrientsTimeTrend() - a full week

Code
make_day <- function(foods, units) {
  cbind(food = foods, units = units)
}

day2 <- make_day(
  foods = c("Cereals, QUAKER, Quick Oats, Dry",
            "Bananas, raw",
            "Fish, tuna, white, canned in oil, drained solids",
            "Bread, multi-grain (includes whole-grain)",
            "Egg, whole, cooked, hard-boiled",
            "Potatoes, flesh and skin, raw"),
  units = c("1.0","1.0","1.0","1.0","1.5","1.0")
)

day3 <- make_day(
  foods = c("Yogurt, plain, low fat",
            "Oranges, raw, California, valencias",
            "Egg, whole, cooked, hard-boiled",
            "Potatoes, flesh and skin, raw",
            "Fish, tuna, white, canned in oil, drained solids",
            "Mushrooms, portabella, grilled"),
  units = c("1.0","0.75","1.5","1.0","1.0","0.85")
)

day4 <- make_day(
  foods = c("Cereals, QUAKER, Quick Oats, Dry",
            "Bananas, raw",
            "Fish, tuna, white, canned in oil, drained solids",
            "Bread, multi-grain (includes whole-grain)",
            "Egg, whole, cooked, hard-boiled",
            "Apples, raw, with skin (Includes foods for USDA's Food Distribution Program)"),
  units = c("1.0","1.0","1.0","1.0","1.5","1.0")
)

day5 <- make_day(
  foods = c("Yogurt, plain, low fat",
            "Oranges, raw, California, valencias",
            "Egg, whole, cooked, hard-boiled",
            "Bread, multi-grain (includes whole-grain)",
            "Fish, tuna, white, canned in oil, drained solids",
            "Potatoes, flesh and skin, raw"),
  units = c("1.0","0.75","1.5","1.0","1.0","1.0")
)

day6 <- make_day(
  foods = c("Cereals, QUAKER, Quick Oats, Dry",
            "Bananas, raw",
            "Mushrooms, portabella, grilled",
            "Bread, multi-grain (includes whole-grain)",
            "Egg, whole, cooked, hard-boiled",
            "Apples, raw, with skin (Includes foods for USDA's Food Distribution Program)"),
  units = c("1.0","1.0","0.85","1.0","1.5","1.0")
)

day7 <- make_day(
  foods = c("Yogurt, plain, low fat",
            "Bananas, raw",
            "Fish, tuna, white, canned in oil, drained solids",
            "Potatoes, flesh and skin, raw",
            "Egg, whole, cooked, hard-boiled",
            "Mushrooms, portabella, grilled"),
  units = c("1.0","1.0","1.0","1.0","1.5","0.85")
)

my_week <- list(day1, day2, day3, day4, day5, day6, day7)

results_week <- dietBalance(
  my_daily_food = my_week,
  food_database = "USDA",
  age    = 21,
  gender = "female"
)
                              nutrient proportion(%RDA)         group
1                            Water (g)         17.24911 macronutrient
2             Fiber, total dietary (g)         67.66000 macronutrient
3      Carbohydrate, by difference (g)         89.48000 macronutrient
4                     Calcium, Ca (mg)         31.24570       mineral
5                    Potassium, K (mg)         39.40289       mineral
6                        Iron, Fe (mg)         43.68889       mineral
7                      Sodium, Na (mg)         56.67047       mineral
8                        Zinc, Zn (mg)         77.53750       mineral
9                      Copper, Cu (mg)         99.77778       mineral
10      Vitamin K (phylloquinone) (ug)         12.61111       vitamin
11            Vitamin D (D2 + D3) (ug)         22.97333       vitamin
12   Vitamin E (alpha-tocopherol) (mg)         27.96000       vitamin
13                 Vitamin A, RAE (ug)         34.72443       vitamin
14                    Folate, DFE (ug)         49.11975       vitamin
15 Vitamin C, total ascorbic acid (mg)         51.16667       vitamin
16                        Thiamin (mg)         72.45455       vitamin
17               Pantothenic acid (mg)         91.32000       vitamin

Cross-Country Comparison

USDA vs French CIQUAL

USDA

Code
simple_usda <- matrix(
  c("Egg, whole, cooked, hard-boiled",                                              "1.5",
    "Bread, multi-grain (includes whole-grain)",                                    "1.0",
    "Apples, raw, with skin (Includes foods for USDA's Food Distribution Program)", "1.0"),
  ncol = 2, byrow = TRUE,
  dimnames = list(NULL, c("food","units"))
)

results_usda <- dietBalance(simple_usda, food_database = "USDA",
                             age = 20, gender = "male")
                              nutrient proportion(%RDA)         group
1                            Water (g)         6.335946 macronutrient
2             Fiber, total dietary (g)        25.789474 macronutrient
3      Carbohydrate, by difference (g)        45.253846 macronutrient
4                          Protein (g)        58.017857 macronutrient
5                    Potassium, K (mg)        11.191489       mineral
6                     Calcium, Ca (mg)        18.400000       mineral
7                   Magnesium, Mg (mg)        24.500000       mineral
8                        Zinc, Zn (mg)        30.136364       mineral
9                      Copper, Cu (mg)        36.444444       mineral
10                     Sodium, Na (mg)        37.866667       mineral
11                       Iron, Fe (mg)        55.062500       mineral
12                  Phosphorus, P (mg)        71.000000       mineral
13                  Manganese, Mn (mg)        91.260870       mineral
14      Vitamin K (phylloquinone) (ug)         3.375000       vitamin
15 Vitamin C, total ascorbic acid (mg)         5.222222       vitamin
16   Vitamin E (alpha-tocopherol) (mg)        13.966667       vitamin
17            Vitamin D (D2 + D3) (ug)        22.000000       vitamin
18                 Vitamin A, RAE (ug)        25.166667       vitamin
19                         Niacin (mg)        26.431250       vitamin
20                        Thiamin (mg)        32.916667       vitamin
21                    Folate, DFE (ug)        36.000000       vitamin
22                    Vitamin B-6 (mg)        37.384615       vitamin
23               Pantothenic acid (mg)        49.880000       vitamin
24                   Vitamin B-12 (ug)        69.375000       vitamin
25                     Riboflavin (mg)        71.307692       vitamin
26                 Choline, total (mg)        84.745455       vitamin
Code
nutrientIntakePlot(daily_intake = results_usda,
                   macronutrientsOnly = TRUE)

CIQUAL

Code
simple_ciqual <- matrix(
  c("Egg, hard-boiled",          "1.5",
    "Bread (average)",           "1.0",
    "Apple, pulp and peel, raw", "1.0"),
  ncol = 2, byrow = TRUE,
  dimnames = list(NULL, c("food","units"))
)

results_ciqual <- dietBalance(simple_ciqual, food_database = "CIQUAL",
                               age = 20, gender = "male")
                              nutrient proportion(%RDA)         group
1                            Water (g)         6.201351 macronutrient
2             Fiber, total dietary (g)        12.236842 macronutrient
3                          Protein (g)        51.285714 macronutrient
4      Carbohydrate, by difference (g)        51.907692 macronutrient
5                     Calcium, Ca (mg)         9.804000       mineral
6                    Potassium, K (mg)         9.829787       mineral
7                   Magnesium, Mg (mg)        14.142500       mineral
8                        Zinc, Zn (mg)        22.327273       mineral
9                          Iodine (ug)        49.833333       mineral
10                       Iron, Fe (mg)        49.987500       mineral
11                  Phosphorus, P (mg)        55.200000       mineral
12                     Sodium, Na (mg)        56.133333       mineral
13      Vitamin K (phylloquinone) (ug)         2.366667       vitamin
14 Vitamin C, total ascorbic acid (mg)         6.944444       vitamin
15                         Niacin (mg)         8.106250       vitamin
16            Vitamin D (D2 + D3) (ug)        11.200000       vitamin
17   Vitamin E (alpha-tocopherol) (mg)        14.633333       vitamin
18                        Thiamin (mg)        18.750000       vitamin
19                    Folate, DFE (ug)        22.625000       vitamin
20                    Vitamin B-6 (mg)        30.615385       vitamin
21               Pantothenic acid (mg)        51.780000       vitamin
22                     Riboflavin (mg)        64.307692       vitamin
23                   Vitamin B-12 (ug)        75.625000       vitamin
Code
nutrientIntakePlot(daily_intake = results_ciqual,
                   macronutrientsOnly = TRUE)

Shiny App

NutrienTrackeRapp()

Strengths & Limitations

Strengths

  • 5 international databases in one package
  • Built-in RDA comparisons (NIH guidelines)
  • Nice visualizations
  • Interactive Shiny app included
  • Useful for public health, nutrition, sports science

Limitations

  • Food names must match database exactly
  • No restaurant or branded foods
  • Nutrient data per 100g — must convert manually
  • Databases not updated in real time

Summary

NutrienTrackeR lets you:

  1. Search any food across 5 country databases
  2. Build a custom daily or weekly diet matrix in R
  3. Compare your intake vs NIH recommendations
  4. Visualize nutrients with beautiful built-in plots
  5. Explore everything interactively in the Shiny app
install.packages("NutrienTrackeR")

Thank You