見出し画像

管理栄養士とみるアメリカの国民健康栄養調査(National Health and Nutrition Survey: NHANES).part1

ちょっと前にアメリカの国民健康栄養調査(National Health and Nutrition Survey: NHANES)の食事項目が公開された。

食事の項目だけずっと公開されていなかったのだが、

日本でも国民健康・栄養調査が毎年行われているが、オープンデータではなく、二次利用には許可が必要になる。厚労省に依頼される形で国立健康栄養研究所がまとめているので、日本のを見たい人はこちらを


さて、本題。
NHANESは、オープンデータで誰でも触れるのですが、xptというSASのファイル形式でしか配布していない。これはRでも見ることができるので見ていこうと思う。

この食事調査は2日間行われており、1日目、2日目、2日間の合計で解析をしています。

今回は、下記の項目を示します。


重量当たりのたんぱく質、脂質、炭水化物の割合

栄養のバランスは基本的に重量当たりではなく、エネルギー当たりでみますが、今回は重量とエネルギー当たり両方示します。

1day


2day

total

当たり前ですが、どの群もあまり比率は変わらなく、
炭水化物が多いです。


エネルギー当たりのたんぱく質、脂質、炭水化物の割合

エネルギー当たりのたんぱく質、脂質、炭水化物の割合です。
これをPCFバランスといいます。
PFCバランスが15~20: 20~30: 50~60 ぐらいだとちょうどいいです。

1day

2day

total

脂質が多く、炭水化物が少ないです。

食品カテゴリーごとのたんぱく質、脂質、炭水化物の割合

NHANESはUSDAcodeという項目があり、なにを食べたか8桁の数値で示してあります。これをアメリカの食品成分表であるFNDDSの食品グループに割り当てた結果です。この食品グループは、4桁の数値です。

このサイトのDocumentation DatabasesのFoods and Beverages.xlsxに食品グループが載っています。

めんどくさくて、Grams当たりの割合と表記していますが、計算式としては
食品グループのX ÷ 全食品のX
Xを重量、エネルギー、たんぱく質、脂質、炭水化物に置き換えて計算しています。

あと、さっきまで使っていた色が、12色までしかないので、色が少し水らくなっています。詳しくはRコードで。色弱だから間違えたこと言ってるかも

1day

Water が一番多い。なお、清涼飲料水やアルコールは別(BeveragesとAlcoholic Beverages)。
Mixed Dishesが一番多いエネルギー源。次にSnacks and Sweets, Protein Foods。
Mixed Dishes が一番多い。次がProtein Foods
Mixed Dishesが多いな。次がProtein Foods, Snack and Sweetsの順
Mixed Dishes, Snacks and Sweets, Grainsの順

2day

1day と同じ値になってしまった。

total

大体一緒

コード

めんどくさくて、コピペとchatGPTに頼ったけど、For文でループしたほうが絶対良い。


library(tidyverse)
library(haven)


df1 <- read_xpt("DR1IFF_L.xpt") # ファイルパスを入れる
df2 <- read_xpt("DR2IFF_L.xpt")


labels <- sapply(df1, attr, "label")
labels[is.na(labels)] <- names(df1)
colnames(df1) <- labels

labels <- sapply(df2, attr, "label")
labels[is.na(labels)] <- names(df2)
colnames(df2) <- labels

#------------------------------------------------------------------------------------------------------------------------------------------
df1_sub <- df1 %>% select( "Protein (gm)", 
                          "Carbohydrate (gm)", "Total fat (gm)")

df1_tol <- colSums(df1_sub, na.rm = T)



df_pie <- data.frame(
  Nutrient = names(df1_tol),
  Values = as.numeric(df1_tol)
)


# 割合(%)を計算
df_pie <- df_pie %>%
  mutate(Percentage = round(Values / sum(Values) * 100, 1),  # 割合計算
         Label = paste0(Nutrient, "\n", Percentage, "%"))  # ラベル作成

# ggplot2 で円グラフを描く
p <- ggplot(df_pie, aes(x = "", y = Values, fill = Nutrient)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +  # 円グラフに変換
  theme_void() +  # 余計な要素を消す
  labs(title = "1day栄養成分の重量当たりの割合") +
  scale_fill_brewer(palette = "Set3") +  # 色の設定
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5)

# PNGとして保存
ggsave(filename = "", # ファイルパス
       plot = p, width = 8, height = 8, dpi = 300)

#------------------------------------------------------------------------------------------------------------------------------------------

df1_sub <- df1 %>% select("Energy (kcal)", "Protein (gm)", 
                           "Carbohydrate (gm)", "Total fat (gm)")

df1_tol <- colSums(df1_sub, na.rm = T)

df_pie <- data.frame(
  Nutrient = names(df1_tol),
  Values = as.numeric(df1_tol)
)


df_pie <- df_pie %>%
  mutate(Energy_Calc = round(ifelse(Nutrient %in% c("Protein (gm)", "Carbohydrate (gm)"), Values * 4, 
                                    ifelse(Nutrient == "Total fat (gm)", Values * 9, 
                                           ifelse(Nutrient == "Energy (kcal)", Values * 1, NA))), 1))



# "Energy (kcal)" の値を取得
total_energy <- df_pie %>% filter(Nutrient == "Energy (kcal)") %>% pull(Values)

# 割合(%)の計算
df_pie <- df_pie %>%
  mutate(Percentage = ifelse(Nutrient %in% c("Protein (gm)", "Carbohydrate (gm)", "Total fat (gm)"),
                             round(Energy_Calc / total_energy * 100, 1), NA),  # 割合計算
                              Label = paste0(Nutrient, "\n", Percentage, "%"))  # ラベル作成


# 円グラフの作成
p <- ggplot(df_pie, aes(x = "", y = Percentage, fill = Nutrient)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +  # 円グラフに変換
  theme_void() +  # 余計な要素を消す
  labs(title = "1day栄養成分のEnergy (kcal)当たりの割合") +
  scale_fill_brewer(palette = "Set3") +  # 色の設定
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5)  # % を中央に表示

# PNGとして保存
ggsave(filename = "", # ファイルパス
       plot = p, width = 8, height = 8, dpi = 300)



#------------------------------------------------------------------------------------------------------------------------------------------
df2_sub <- df2 %>% select( "Protein (gm)", 
                           "Carbohydrate (gm)", "Total fat (gm)")

df2_tol <- colSums(df2_sub, na.rm = T)

df_pie <- data.frame(
  Nutrient = names(df2_tol),
  Values = as.numeric(df2_tol)
)

# 割合(%)を計算
df_pie <- df_pie %>%
  mutate(Percentage = round(Values / sum(Values) * 100, 1),  # 割合計算
         Label = paste0(Nutrient, "\n", Percentage, "%"))  # ラベル作成

# ggplot2 で円グラフを描く
p <- ggplot(df_pie, aes(x = "", y = Values, fill = Nutrient)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +  # 円グラフに変換
  theme_void() +  # 余計な要素を消す
  labs(title = "2day栄養成分の重量当たりの割合") +
  scale_fill_brewer(palette = "Set3") +  # 色の設定
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5)

# PNGとして保存
ggsave(filename = "",# ファイルパス 
       plot = p, width = 8, height = 8, dpi = 300)

#------------------------------------------------------------------------------------------------------------------------------------------

df2_sub <- df2 %>% select("Energy (kcal)", "Protein (gm)", 
                          "Carbohydrate (gm)", "Total fat (gm)")

df2_tol <- colSums(df2_sub, na.rm = T)

df_pie <- data.frame(
  Nutrient = names(df2_tol),
  Values = as.numeric(df2_tol)
)


df_pie <- df_pie %>%
  mutate(Energy_Calc = round(ifelse(Nutrient %in% c("Protein (gm)", "Carbohydrate (gm)"), Values * 4, 
                                    ifelse(Nutrient == "Total fat (gm)", Values * 9, 
                                           ifelse(Nutrient == "Energy (kcal)", Values * 1, NA))), 1))



# "Energy (kcal)" の値を取得
total_energy <- df_pie %>% filter(Nutrient == "Energy (kcal)") %>% pull(Values)

# 割合(%)の計算
df_pie <- df_pie %>%
  mutate(Percentage = ifelse(Nutrient %in% c("Protein (gm)", "Carbohydrate (gm)", "Total fat (gm)"),
                             round(Energy_Calc / total_energy * 100, 1), NA),  # 割合計算
         Label = paste0(Nutrient, "\n", Percentage, "%"))  # ラベル作成


# 円グラフの作成
p <- ggplot(df_pie, aes(x = "", y = Percentage, fill = Nutrient)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +  # 円グラフに変換
  theme_void() +  # 余計な要素を消す
  labs(title = "2day栄養成分のEnergy (kcal)当たりの割合") +
  scale_fill_brewer(palette = "Set3") +  # 色の設定
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5)  # % を中央に表示

# PNGとして保存
ggsave(filename = "",# ファイルパス 
       plot = p, width = 8, height = 8, dpi = 300)


df3 <- bind_rows(df1, df2)
#------------------------------------------------------------------------------------------------------------------------------------------
df3_sub <- df3 %>% select("Protein (gm)", 
                          "Carbohydrate (gm)", "Total fat (gm)")

df3_tol <- colSums(df3_sub, na.rm = T)

df_pie <- data.frame(
  Nutrient = names(df3_tol),
  Values = as.numeric(df3_tol)
)

# 割合(%)を計算
df_pie <- df_pie %>%
  mutate(Percentage = round(Values / sum(Values) * 100, 1),  # 割合計算
         Label = paste0(Nutrient, "\n", Percentage, "%"))  # ラベル作成

# ggplot2 で円グラフを描く
p <- ggplot(df_pie, aes(x = "", y = Values, fill = Nutrient)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +  # 円グラフに変換
  theme_void() +  # 余計な要素を消す
  labs(title = "total栄養成分の重量当たりの割合") +
  scale_fill_brewer(palette = "Set3") +  # 色の設定
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5)

# PNGとして保存
ggsave(filename = "", # ファイルパス 
       plot = p, width = 8, height = 8, dpi = 300)

#------------------------------------------------------------------------------------------------------------------------------------------

df3_sub <- df3 %>% select("Energy (kcal)", "Protein (gm)", 
                          "Carbohydrate (gm)", "Total fat (gm)")

df3_tol <- colSums(df3_sub, na.rm = T)

df_pie <- data.frame(
  Nutrient = names(df3_tol),
  Values = as.numeric(df3_tol)
)


df_pie <- df_pie %>%
  mutate(Energy_Calc = round(ifelse(Nutrient %in% c("Protein (gm)", "Carbohydrate (gm)"), Values * 4, 
                                    ifelse(Nutrient == "Total fat (gm)", Values * 9, 
                                           ifelse(Nutrient == "Energy (kcal)", Values * 1, NA))), 1))



# "Energy (kcal)" の値を取得
total_energy <- df_pie %>% filter(Nutrient == "Energy (kcal)") %>% pull(Values)

# 割合(%)の計算
df_pie <- df_pie %>%
  mutate(Percentage = ifelse(Nutrient %in% c("Protein (gm)", "Carbohydrate (gm)", "Total fat (gm)"),
                             round(Energy_Calc / total_energy * 100, 1), NA),  # 割合計算
         Label = paste0(Nutrient, "\n", Percentage, "%"))  # ラベル作成


# 円グラフの作成
p <- ggplot(df_pie, aes(x = "", y = Percentage, fill = Nutrient)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +  # 円グラフに変換
  theme_void() +  # 余計な要素を消す
  labs(title = "total栄養成分のEnergy (kcal)当たりの割合") +
  scale_fill_brewer(palette = "Set3") +  # 色の設定
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5)  # % を中央に表示

# PNGとして保存
ggsave(filename = "", # ファイルパス 
       plot = p, width = 8, height = 8, dpi = 300)


#------------------------------------------------------------------------------------------------------------------------------------------
library(readxl)
FNDDS <- read_excel("2021-2023 FNDDS At A Glance - Foods and Beverages.xlsx") # ファイルパス


df1 <- df1 %>% rename(`Food code` = `USDA food code`)
df1$`Food code`<- as.numeric(df1$`Food code`)
FNDDS$`Food code`<- as.numeric(FNDDS$`Food code`)

df1 <- left_join(df1, FNDDS, by="Food code")

df1 <- df1 %>%
  mutate(food_category = case_when(
    # MILK AND DAIRY (1002 - 1904)
    `WWEIA Category number` >= 1002 & `WWEIA Category number` <= 1904 ~ "Milk and Dairy",
    
    # PROTEIN FOODS (2002 - 2806)
    `WWEIA Category number` >= 2002 & `WWEIA Category number` <= 2806 ~ "Protein Foods",
    
    # MIXED DISHES - Meat, Poultry, Seafood (3002 - 3808)
    `WWEIA Category number` >= 3002 & `WWEIA Category number` <= 3808 ~ "Mixed Dishes",
    
    # GRAINS (4002 - 4804)
    `WWEIA Category number` >= 4002 & `WWEIA Category number` <= 4804 ~ "Grains",
    
    # SNACKS AND SWEETS (5002 - 5806)
    `WWEIA Category number` >= 5002 & `WWEIA Category number` <= 5806 ~ "Snacks and Sweets",
    
    # FRUITS (6002 - 6024)
    `WWEIA Category number` >= 6002 & `WWEIA Category number` <= 6024 ~ "Fruits",
    
    # VEGETABLES (6402 - 6806)
    `WWEIA Category number` >= 6402 & `WWEIA Category number` <= 6806 ~ "Vegetables",
    
    # BEVERAGES (7002 - 7304)
    `WWEIA Category number` >= 7002 & `WWEIA Category number` <= 7304 ~ "Beverages",
    
    # ALCOHOLIC BEVERAGES (7502 - 7506)
    `WWEIA Category number` >= 7502 & `WWEIA Category number` <= 7506 ~ "Alcoholic Beverages",
    
    # WATER (7702 - 7804)
    `WWEIA Category number` >= 7702 & `WWEIA Category number` <= 7804 ~ "Water",
    
    # FATS AND OILS (8002 - 8012)
    `WWEIA Category number` >= 8002 & `WWEIA Category number` <= 8012 ~ "Fats and Oils",
    
    # CONDIMENTS AND SAUCES (8402 - 8412)
    `WWEIA Category number` >= 8402 & `WWEIA Category number` <= 8412 ~ "Condiments and Sauces",
    
    # SUGARS (8802 - 8806)
    `WWEIA Category number` >= 8802 & `WWEIA Category number` <= 8806 ~ "Sugars",
    
    # BABY FOODS AND FORMULAS (9002 - 9602)
    `WWEIA Category number` >= 9002 & `WWEIA Category number` <= 9602 ~ "Baby Foods and Formulas",
    
    # OTHER (9802 - 9999)
    `WWEIA Category number` >= 9802 & `WWEIA Category number` <= 9999 ~ "Other",
    
    # デフォルト値
    TRUE ~ NA_character_
  ))

df1_sub <- df1 %>% 
  select(Grams, `Energy (kcal)`, `Protein (gm)`, `Total fat (gm)`, `Carbohydrate (gm)`, food_category)

df1_group <- df1_sub %>% 
  group_by(food_category) %>%
  summarise(across(where(is.numeric), \(x) sum(x, na.rm = TRUE)))

df_pie <- df1_group %>%
  mutate(
    gra = round(Grams / sum(Grams, na.rm = TRUE) * 100, 1),
    Ene = round(`Energy (kcal)` / sum(`Energy (kcal)`, na.rm = TRUE) * 100, 1),
    Pro = round(`Protein (gm)` / sum(`Protein (gm)`, na.rm = TRUE) * 100, 1),
    Fat = round(`Total fat (gm)` / sum(`Total fat (gm)`, na.rm = TRUE) * 100, 1),
    Car = round(`Carbohydrate (gm)` / sum(`Carbohydrate (gm)`, na.rm = TRUE) * 100, 1)
  )

library(scales)

# 20色の異なる色相を生成
colors <- hue_pal()(20)

# プロット対象の列をリストにする
food <- c("gra", "Ene", "Pro", "Fat", "Car")

# ループで複数のグラフを作成
plots <- list()
for (i in food) {
  p <- ggplot(df_pie, aes(x = "", y = !!sym(i), fill = food_category)) +
    geom_bar(stat = "identity", width = 1) +
    coord_polar("y", start = 0) +  # 円グラフに変換
    theme_void() +  # 余計な要素を消す
    labs(title = paste0(i, " 1day栄養成分の Grams 当たりの割合")) +
    scale_fill_manual(values = colors) +  # hue_pal() の色を適用
    geom_text(aes(label = ifelse(!!sym(i) > 1, round(!!sym(i), 1), "")), 
              position = position_stack(vjust = 0.5), size = 5)
  
  plots[[i]] <- p  # リストに保存


# ファイル名を動的に作成
file_name <- paste0("", i, ".png") # ファイルパス

# 画像として保存
ggsave(filename = file_name, plot = p, width = 8, height = 8, dpi = 300)
}


# グラフを表示
for (i in 1:5) {
  print(plots[[food[i]]])  # `print()` を使って表示
}
#------------------------------------------------------------------------------------------------------------------


df2 <- df2 %>% rename(`Food code` = `USDA food code`)
df2$`Food code`<- as.numeric(df2$`Food code`)
FNDDS$`Food code`<- as.numeric(FNDDS$`Food code`)

df2 <- left_join(df2, FNDDS, by="Food code")

df2 <- df2 %>%
  mutate(food_category = case_when(
    # MILK AND DAIRY (1002 - 1904)
    `WWEIA Category number` >= 1002 & `WWEIA Category number` <= 1904 ~ "Milk and Dairy",
    
    # PROTEIN FOODS (2002 - 2806)
    `WWEIA Category number` >= 2002 & `WWEIA Category number` <= 2806 ~ "Protein Foods",
    
    # MIXED DISHES - Meat, Poultry, Seafood (3002 - 3808)
    `WWEIA Category number` >= 3002 & `WWEIA Category number` <= 3808 ~ "Mixed Dishes",
    
    # GRAINS (4002 - 4804)
    `WWEIA Category number` >= 4002 & `WWEIA Category number` <= 4804 ~ "Grains",
    
    # SNACKS AND SWEETS (5002 - 5806)
    `WWEIA Category number` >= 5002 & `WWEIA Category number` <= 5806 ~ "Snacks and Sweets",
    
    # FRUITS (6002 - 6024)
    `WWEIA Category number` >= 6002 & `WWEIA Category number` <= 6024 ~ "Fruits",
    
    # VEGETABLES (6402 - 6806)
    `WWEIA Category number` >= 6402 & `WWEIA Category number` <= 6806 ~ "Vegetables",
    
    # BEVERAGES (7002 - 7304)
    `WWEIA Category number` >= 7002 & `WWEIA Category number` <= 7304 ~ "Beverages",
    
    # ALCOHOLIC BEVERAGES (7502 - 7506)
    `WWEIA Category number` >= 7502 & `WWEIA Category number` <= 7506 ~ "Alcoholic Beverages",
    
    # WATER (7702 - 7804)
    `WWEIA Category number` >= 7702 & `WWEIA Category number` <= 7804 ~ "Water",
    
    # FATS AND OILS (8002 - 8012)
    `WWEIA Category number` >= 8002 & `WWEIA Category number` <= 8012 ~ "Fats and Oils",
    
    # CONDIMENTS AND SAUCES (8402 - 8412)
    `WWEIA Category number` >= 8402 & `WWEIA Category number` <= 8412 ~ "Condiments and Sauces",
    
    # SUGARS (8802 - 8806)
    `WWEIA Category number` >= 8802 & `WWEIA Category number` <= 8806 ~ "Sugars",
    
    # BABY FOODS AND FORMULAS (9002 - 9602)
    `WWEIA Category number` >= 9002 & `WWEIA Category number` <= 9602 ~ "Baby Foods and Formulas",
    
    # OTHER (9802 - 9999)
    `WWEIA Category number` >= 9802 & `WWEIA Category number` <= 9999 ~ "Other",
    
    # デフォルト値
    TRUE ~ NA_character_
  ))

df2_sub <- df2 %>% 
  select(Grams, `Energy (kcal)`, `Protein (gm)`, `Total fat (gm)`, `Carbohydrate (gm)`, food_category)

df2_group <- df2_sub %>% 
  group_by(food_category) %>%
  summarise(across(where(is.numeric), \(x) sum(x, na.rm = TRUE)))

df_pie <- df1_group %>%
  mutate(
    gra = round(Grams / sum(Grams, na.rm = TRUE) * 100, 1),
    Ene = round(`Energy (kcal)` / sum(`Energy (kcal)`, na.rm = TRUE) * 100, 1),
    Pro = round(`Protein (gm)` / sum(`Protein (gm)`, na.rm = TRUE) * 100, 1),
    Fat = round(`Total fat (gm)` / sum(`Total fat (gm)`, na.rm = TRUE) * 100, 1),
    Car = round(`Carbohydrate (gm)` / sum(`Carbohydrate (gm)`, na.rm = TRUE) * 100, 1)
  )

library(scales)

# 20色の異なる色相を生成
colors <- hue_pal()(20)

# プロット対象の列をリストにする
food <- c("gra", "Ene", "Pro", "Fat", "Car")

# ループで複数のグラフを作成
plots <- list()
for (i in food) {
  p <- ggplot(df_pie, aes(x = "", y = !!sym(i), fill = food_category)) +
    geom_bar(stat = "identity", width = 1) +
    coord_polar("y", start = 0) +  # 円グラフに変換
    theme_void() +  # 余計な要素を消す
    labs(title = paste0(i, " 2day栄養成分の Grams 当たりの割合")) +
    scale_fill_manual(values = colors) +  # hue_pal() の色を適用
    geom_text(aes(label = ifelse(!!sym(i) > 1, round(!!sym(i), 1), "")), 
              position = position_stack(vjust = 0.5), size = 5)
  
  plots[[i]] <- p  # リストに保存
  
  # ファイル名を動的に作成
  #file_name <- paste0("", i, ".png")# ファイルパス
  
  # 画像として保存
  #ggsave(filename = file_name, plot = p, width = 8, height = 8, dpi = 300)
}

# グラフを表示
for (i in 1:5) {
  print(plots[[food[i]]])  # `print()` を使って表示
}


#------------------------------------------------------------------------------------------------------------------

df3 <- df3 %>% rename(`Food code` = `USDA food code`)
df3$`Food code`<- as.numeric(df3$`Food code`)
FNDDS$`Food code`<- as.numeric(FNDDS$`Food code`)

df3 <- left_join(df3, FNDDS, by="Food code")

df3 <- df3 %>%
  mutate(food_category = case_when(
    # MILK AND DAIRY (1002 - 1904)
    `WWEIA Category number` >= 1002 & `WWEIA Category number` <= 1904 ~ "Milk and Dairy",
    
    # PROTEIN FOODS (2002 - 2806)
    `WWEIA Category number` >= 2002 & `WWEIA Category number` <= 2806 ~ "Protein Foods",
    
    # MIXED DISHES - Meat, Poultry, Seafood (3002 - 3808)
    `WWEIA Category number` >= 3002 & `WWEIA Category number` <= 3808 ~ "Mixed Dishes",
    
    # GRAINS (4002 - 4804)
    `WWEIA Category number` >= 4002 & `WWEIA Category number` <= 4804 ~ "Grains",
    
    # SNACKS AND SWEETS (5002 - 5806)
    `WWEIA Category number` >= 5002 & `WWEIA Category number` <= 5806 ~ "Snacks and Sweets",
    
    # FRUITS (6002 - 6024)
    `WWEIA Category number` >= 6002 & `WWEIA Category number` <= 6024 ~ "Fruits",
    
    # VEGETABLES (6402 - 6806)
    `WWEIA Category number` >= 6402 & `WWEIA Category number` <= 6806 ~ "Vegetables",
    
    # BEVERAGES (7002 - 7304)
    `WWEIA Category number` >= 7002 & `WWEIA Category number` <= 7304 ~ "Beverages",
    
    # ALCOHOLIC BEVERAGES (7502 - 7506)
    `WWEIA Category number` >= 7502 & `WWEIA Category number` <= 7506 ~ "Alcoholic Beverages",
    
    # WATER (7702 - 7804)
    `WWEIA Category number` >= 7702 & `WWEIA Category number` <= 7804 ~ "Water",
    
    # FATS AND OILS (8002 - 8012)
    `WWEIA Category number` >= 8002 & `WWEIA Category number` <= 8012 ~ "Fats and Oils",
    
    # CONDIMENTS AND SAUCES (8402 - 8412)
    `WWEIA Category number` >= 8402 & `WWEIA Category number` <= 8412 ~ "Condiments and Sauces",
    
    # SUGARS (8802 - 8806)
    `WWEIA Category number` >= 8802 & `WWEIA Category number` <= 8806 ~ "Sugars",
    
    # BABY FOODS AND FORMULAS (9002 - 9602)
    `WWEIA Category number` >= 9002 & `WWEIA Category number` <= 9602 ~ "Baby Foods and Formulas",
    
    # OTHER (9802 - 9999)
    `WWEIA Category number` >= 9802 & `WWEIA Category number` <= 9999 ~ "Other",
    
    # デフォルト値
    TRUE ~ NA_character_
  ))

df3_sub <- df3 %>% 
  select(Grams, `Energy (kcal)`, `Protein (gm)`, `Total fat (gm)`, `Carbohydrate (gm)`, food_category)

df3_group <- df3_sub %>% 
  group_by(food_category) %>%
  summarise(across(where(is.numeric), \(x) sum(x, na.rm = TRUE)))

df_pie <- df3_group %>%
  mutate(
    gra = round(Grams / sum(Grams, na.rm = TRUE) * 100, 1),
    Ene = round(`Energy (kcal)` / sum(`Energy (kcal)`, na.rm = TRUE) * 100, 1),
    Pro = round(`Protein (gm)` / sum(`Protein (gm)`, na.rm = TRUE) * 100, 1),
    Fat = round(`Total fat (gm)` / sum(`Total fat (gm)`, na.rm = TRUE) * 100, 1),
    Car = round(`Carbohydrate (gm)` / sum(`Carbohydrate (gm)`, na.rm = TRUE) * 100, 1)
  )

library(scales)

# 20色の異なる色相を生成
colors <- hue_pal()(20)

# プロット対象の列をリストにする
food <- c("gra", "Ene", "Pro", "Fat", "Car")

# ループで複数のグラフを作成
plots <- list()
for (i in food) {
  p <- ggplot(df_pie, aes(x = "", y = !!sym(i), fill = food_category)) +
    geom_bar(stat = "identity", width = 1) +
    coord_polar("y", start = 0) +  # 円グラフに変換
    theme_void() +  # 余計な要素を消す
    labs(title = paste0(i, " total栄養成分の Grams 当たりの割合")) +
    scale_fill_manual(values = colors) +  # hue_pal() の色を適用
    geom_text(aes(label = ifelse(!!sym(i) > 1, round(!!sym(i), 1), "")), 
              position = position_stack(vjust = 0.5), size = 5)
  
  plots[[i]] <- p  # リストに保存
  
  # ファイル名を動的に作成
  file_name <- paste0("", i, ".png")# ファイルパス
  
  # 画像として保存
  ggsave(filename = file_name, plot = p, width = 8, height = 8, dpi = 300)
}

# グラフを表示
for (i in 1:5) {
  print(plots[[food[i]]])  # `print()` を使って表示
}






つぎは、一人当たりの平均摂取量とか対象者特性とかみようと思います。

いいなと思ったら応援しよう!