У меня вопрос об использовании циклов for для создания нескольких PDF-файлов фигур с использованием ggplot2 в R. У меня есть набор данных о качестве воды для нескольких станций отбора проб для большого количества параметров, попадающих в одну из нескольких групп.
Моя цель - создать отдельный файл PDF для каждой станции, содержащий несколько простых диаграмм рассеяния для каждого параметра, сгруппированных по группе параметров. Мой код ниже.
Изначально я использовал внутреннюю часть для l oop, чтобы сгенерировать графики для одной станции отбора проб и сохранить ее в PDF. Когда я вложил его во внешнее поле для l oop, я столкнулся с проблемой, когда вместо создания уникальных PDF-файлов, содержащих только данные для каждой станции отбора проб, он генерирует идентичные PDF-файлы для всех станций отбора проб, содержащих графики с данными для всех станций сверху друг с другом. Мне не удалось найти исправление, чтобы каждый PDF-файл содержал только данные этой станции.
full_set <- list.files(pattern = "*xlsx") %>% map_df(~read_excel(.))
full_set_annual_means <- full_set %>% group_by(Station, Group, Constituent, Year) %>%
summarize(annual_mean = mean(Monthly_Average))
for (st in unique(full_set_annual_means$Station)) {
filename <- sprintf("%s plots.pdf", toString(st))
pdf(file = filename, width = 10.5, height = 8, paper = "a4r")
for (var in unique(full_set_annual_means$Group)) {
print(ggplot(full_set_annual_means[full_set_annual_means$Group == var, ], aes(Year, annual_mean)) +
geom_point() + facet_wrap(~Constituent, scales = "free_y") + ggtitle(var))
}
dev.off()
}
Редактировать:
Я нашел способ заставить его работать так, как я планировал. Сначала я пытался отфильтровать данные по станции во внешнем для l oop, переназначив отфильтрованную версию набора данных переменной full_set_annual_means следующим образом:
full_set_annual_means <- full_set_annual_means %>% filter(Station == st)
Но тем самым я перезаписал полный набор данных с отфильтрованной версией, поэтому первая итерация l oop будет работать, а затем для оставшихся итераций l oop будет выводиться пустой файл PDF. Вместо этого сохранив отфильтрованные данные в качестве промежуточной переменной:
station_set <- full_set_annual_means %>% filter(Station == st)
Я сохранил полный набор данных для будущих итераций l oop. Вот обновленный код в полном объеме, который работал так, как я задумал:
full_set <- list.files(pattern = "*xlsx") %>% map_df(~read_excel(.))
full_set_annual_means <- full_set %>% group_by(Station, Group, Constituent, Year) %>%
summarize(annual_mean = mean(Monthly_Average))
for (st in unique(full_set_annual_means$Station)) {
station_set <- full_set_annual_means %>% filter(Station == st)
filename <- sprintf("%s plots.pdf", toString(st))
pdf(file = filename, width = 10.5, height = 8, paper = "a4r")
for (var in unique(station_set$Group)) {
print(ggplot(station_set[station_set$Group == var, ], aes(Year, annual_mean)) +
geom_point() + facet_wrap(~Constituent, scales = "free_y") + ggtitle(var))
}
dev.off()
}