
管理栄養士とみるアメリカの国民健康栄養調査(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





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()` を使って表示
}
つぎは、一人当たりの平均摂取量とか対象者特性とかみようと思います。