Создавайте различные подмножества, создавайте их и сохраняйте графики - PullRequest
1 голос
/ 26 апреля 2019

У меня есть серия больших фреймов данных, которые выглядят так:

Year   Variable   Class
1999   0.4504     a
1999   0.4244     a
1999   0.8980     b
1999   0.8901     b
2000   0.2552     a
2000   0.6504     a
2000   0.7830     b
2000   0.2030     b
...    ...        ...
...    ...        ...
2018   0.6520     a
2018   0.1403     a
2018   0.4502     b
2018   0.1240     b

С 15 различными классами и минимум 500 наблюдений за каждый год и класс. Я хочу создать подмножество для каждого года и класса (то есть 20 лет * 15 классов = 300 подмножеств) и построить график Q-Q, чтобы посмотреть на их распределение, чтобы увидеть, насколько они отличаются от нормальных.

Проблема в том, что даже если я могу создать подмножества с помощью цикла, я не знаю, как сохранить графики, чтобы потом их просматривать.

Идея примерно такая:

library(data.table)
library(ggpubr)

dataframe_list <- list.files(path="B:/Data/", pattern=".csv", full.names=TRUE)
years <- c(1999:2018)

for (i in 1:13){
  db <- fread(dataframe_list[i])
  for (j in 1:length(years)){
    db_year <- subset(db, db$Year==years[j])
    class <- levels(as.factor(db_year$Class))
    for (k in 1:length(class)){
      db_year_class <- subset(db_year, db_year$Class==class[k])
    } 
  }
}

Сделать график в третьем цикле, используя:

ggqqplot(db_year_class$Variable)

и сохраняйте его каким-либо образом, пока у меня все они не будут в конце цикла. Поскольку их не менее 300 для каждого кадра данных в списке, хранить графики в одном файле для каждого кадра данных было бы замечательно.

Редактировать Хорошо, вот как я его адаптировал:

library(data.table)
library(ggpubr)

dataframe_list <- list.files(path="B:/Data/", pattern=".csv", full.names=TRUE)
df <- c(A, B, C, D, E, F, G, H, I, J, K, L, M)
years <- c(1999:2018)
plot_list <- list()

for (i in 1:13){
  db <- fread(dataframe_list[i])
  for (j in 1:length(years)){
    db_year <- subset(db, db$Year==years[j])
    class <- levels(as.factor(db_year$Class))
    for (k in 1:length(class)){
      db_year_class <- subset(db_year, db_year$Class==class[k])
      plot_list[[k]] <- ggqqplot(db_year_class$Variable)+ggtitle(paste0("Code_0_", df[i], "_", years[j], "_", class[k]))
      outfiles <- paste0("B:/Results/Plot/Code_0_", df[i], "_", years[j], ".pdf")
      pdf(file=outfiles, onefile = TRUE)
      for(z in seq_along(list)) {
        print(plot_list[[z]])
      }
      dev.off()
    } 
  }
}

Результатом является pdf для каждого года, который не очень удобен, но в противном случае использование объекта списка не сработает: список был бы перезаписан в конце цикла.

1 Ответ

0 голосов
/ 26 апреля 2019

Вот вам прототип, который вы можете использовать - я только что сделал один цикл для значений cyl в наборе данных mtcars, но вы можете расширить его на свой вариант использования:

library(ggplot2)
#container list to hold ggplots
l <- list()

#unique cylinder groups
cyl_groups <- sort(unique(mtcars$cyl))

#iterate through each cylinder group, plotting mpg vs disp
for(j in seq_along(cyl_groups)){
  l[[j]] <- ggplot(mtcars[mtcars$cyl == cyl_groups[[j]], ], aes(mpg, disp)) + geom_point() + ggtitle(paste0("Cylinders = ", cyl_groups[j]))
}

#save into one PDF
pdf("plots.pdf", onefile = TRUE)
for(i in seq_along(l)) {
  print(l[[i]])
}
dev.off()

Это дает вам в PDF со страницей для каждого сюжета.

...