Итак, допустим, что ваши данные выглядит следующим образом:
base_data = expand.grid(Year = 2013:2015,
Plot = 1:3,
SampleID = LETTERS[1:3],
ObsID = 1:4)
n = nrow(base_data)
base_data$x = runif(n)
base_data$y = rnorm(n)
head(base_data)
# Year Plot SampleID ObsID x y
# 1 2013 1 A 1 0.5504904 0.64624816
# 2 2014 1 A 1 0.5337804 0.08473398
# 3 2015 1 A 1 0.9584508 0.31683347
# 4 2013 2 A 1 0.0854122 0.61898020
# 5 2014 2 A 1 0.8061409 -0.46255868
# 6 2015 2 A 1 0.8764612 0.24384120
В следующий раз вы задаете вопрос, который вы должны включать в себя код для создания данных или поделиться своими собственными данными с dput()
. Тогда нет никаких догадок о том, как выглядят ваши данные, какие вещи классов и т. Д.
Во всяком случае, для построения y в сравнении с x для каждого года, графика и образца. Мне нравится использовать dplyr
для этого:
library(dplyr)
# first we group our data
group_by(base_data, Year, Plot, SampleID) %>%
# then we "do" a function that saves a plot
# within this function, `.` is an abbreviation for
# the piece of the data frame that is one group
do({
# create a filename. Within a group, there is only
# one value each for year, plot, and sample ID
# so I'll just use the first row in the filename
group_name = paste0("y", .[1, "Year"],
"-p", .[1, "Plot"],
"-s", .[1, "SampleID"])
# initialize the file
png(filename = paste0(group_name, ".png"))
# draw the plot
plot(.[["x"]], .[["y"]])
# close the file
dev.off()
# dplyr will be happy if we return a data frame
return(.)
})
Это должно создать сюжет, сохраненный в рабочем каталоге для каждой комбинации года, участок, и образец ID. Я заметил, код очень тщательно, но я буду повторять это снова ниже, без комментариев, чтобы подчеркнуть, что это на самом деле очень краткий набор команд:
group_by(base_data, Year, Plot, SampleID) %>%
do({
group_name = paste0("y", .[1, "Year"],
"-p", .[1, "Plot"],
"-s", .[1, "SampleID"])
png(filename = paste0(group_name, ".png"))
plot(.[["x"]], .[["y"]])
dev.off()
return(.)
})
Во-первых, получить данные вместе, используя 'merge' , так что у вас есть один фрейм данных с x и y, а не отдельные кадры для каждого. Если вы используете базовые сюжеты, 'with' является вашим другом. 'subset()' также может сэкономить массу текста (хотя 'dplyr' лучше). Но вы можете сделать это с помощью (подмножество (данные, год == "2015", график == "3", SampleID == "C"), plot (x, y)) '. – Gregor
Спасибо, Грегор, я забыл упомянуть, что я первоначально был настройкой данных, это потребовало от меня написать тонну кода (поскольку петли кажутся свисающей морковкой, которую я никогда не смогу достичь). Это также сделало так много прикрепленных объектов, что это заставило меня почувствовать себя загроможденным. Возможно, захламленный все еще есть путь. – Dilliplaine33
Никогда не присоединяйся, это неприятная привычка. Вы просто хотите выписать кучу сюжетов (скажем, все комбинации) в файлы? Ваш вопрос заставил вас казаться, что вы хотите делать что-то в интерактивном режиме, но вы просто хотите, чтобы сценарий начинал рисовать за каждый год, каждый сюжет, каждый образец, это совсем другой вопрос. – Gregor