В этом случае разумным вариантом является использование split
для преобразования вашего фрейма данных в список фреймов данных, каждый из которых содержит подмножество с определенным уровнем фактора.
split_df <- split(df, df$factor)
Как отметил Колин, paste
может быть векторизовано, поэтому вам нужно вызывать его только один раз.
lfile <- paste("test_", names(split_df), ".png", sep = "")
Сгруппируйте весь свой код построения в функцию.
draw_and_save_histogram <- function(data, file)
{
png(file)
with(data, hist(x))
dev.off()
}
Теперь вы можете более легко сравниватьразница между простым циклом и функцией *apply
(в данном случае mapply
, поскольку нам нужно два входа).
for(i in seq_along(split_df))
{
draw_and_save_histogram(split_df[[i]], lfile[i])
}
mapply(
draw_and_save_histogram,
split_df,
lfile
)
Вместо того, чтобы рисовать множество гистограмм для сохранения вВ разных файлах гораздо предпочтительнее нарисовать один график несколькими панелями, используя lattice
или ggplot2
.
library(lattice)
histogram(~ x | factor, df)
library(ggplot2)
ggplot(df, aes(x)) + geom_histogram() + facet_wrap(~ factor)