2014-11-10 3 views
0

Я пытаюсь подобрать некоторые даты в сезон, а затем объединять ежемесячные графики «даты и амплитуды» для каждого сезона.Графические столбцы из списка фреймов данных

head(dat) 
    Date Amplitude 
1 2009-09-13 -2.6966667 
2 2009-09-14 -0.7264583 
3 2009-09-15 -2.1823333 

Вот мой код для создания сезонов и годМесяца для названия участка:

x <- as.Date(dat$Date, format="%Y/%m/%d") 
x <- as.Date(x, origin="2009-09-13") 
x <- cut(x, breaks="quarter") 
labs <- paste(substr(levels(x),1,4),"/",1:4, sep="") 
dat$DateQ <- factor(x, labels=labs) 
dat$YearMonth <- format(dat$Date, "%Y/%m") 
head(dat) 
Date Amplitude DateQ YearMonth 
1 2009-09-13 -2.6966667 2009/1 2009/09 
2 2009-09-14 -0.7264583 2009/1 2009/09 

Я использовал раскол, чтобы создать кадры данных для каждого сезона, а затем назвал кадры данных с циклом

dat_split_season <- split(dat, dat$DateQ) 
new_names <- c("Summer_2009", "Fall_2009", "Winter_2010", "Spring_2010", 
      "Summer_2010", "Fall_2010", "Winter_2011", 
      "Spring_2011", "Summer_2011", "Fall_2011", 
      "Winter_2012", "Spring_2012", "Summer_2012") 
for (i in 1:length(dat_split_season)) { 
assign(new_names[i], dat_split_season[[i]]) 
} 

Я могу создать желаемые месячные графики по сезонам вручную, изменив df

df <- Winter_2012 
graphs <- lapply(split(df,df$YearMonth), 
    function(gg) ggplot(gg, aes(x=Date, y=Amplitude)) + 
    geom_point() + geom_line() + ylim(-10, 10) + 
    ggtitle(paste(gg$YearMonth)) + theme_bw()) 
do.call("grid.arrange", graphs) 

Я хотел бы использовать цикл for или семейства apply() для последовательности по списку сезонов, выбрав столбцы Date и Amplitude для каждого кадра данных и построения графика по 'YearMonth'.

Проблема, с которой я сталкиваюсь, вероятно, связана с синтаксисом; Я новичок в R и программировании в целом. Но я провел последние несколько дней, прочесывая форум, и я бы оценил какое-то направление на этом этапе. Благодаря!

+0

так что проблема в том, что ваш вызов 'ggplot' работает некорректно? – keegan

+0

ggplot call отлично работает - я хочу упорядочить по списку кадров данных, передавая каждый сезон вызову ggplot без ввода вручную. т. е. разделить время на сезон, разделить сезон на $ YearMonth, перейти к ggplot. Все в одном. Имеет ли это смысл? –

+0

Возможно, у вас есть список dataframes, каждый из которых является сезоном? Вы хотите, чтобы сетка графиков для каждого сезона (каждая панель была YearMonth), или вы хотите полностью независимые сюжеты для каждого YearMonth? – keegan

ответ

1

Вот минимальный пример, который я считаю, воссоздает ваш желаемый результат

df1<-data.frame(YearMonth=c(rep('Aug_2012',10),rep('Sep_2012',10),rep('Oct_2012',10)), value=rnorm(30),t=rep(1:10,3)) 
df2<-data.frame(YearMonth=c(rep('Aug_2012',10),rep('Sep_2012',10),rep('Oct_2012',10)), value=rnorm(30),t=rep(1:10,3)) 
df_list<-list(df1,df2) 

myplots<-lapply(df_list,function(x) 
p<-ggplot(x,aes(x=t,y=value,group=factor(YearMonth),color=factor(YearMonth))) + geom_line() + facet_wrap(~YearMonth) 
) 

lapply используется для доступа к списку dataframes, а затем facet_wrap используется для создания сетки участков для каждого dataframe.

+0

Это сработает, спасибо! Не могли бы вы объяснить, почему вы назначили функцию ggplot переменной «p» в файле lapply(). –

+0

Вы можете сохранить объекты ggplot, чтобы позже вы могли распечатать их или сохранить или добавить к ним слои. Мы не должны этого делать, хотя. В любом случае результат 'lapply()' будет списком объектов 'ggplot', который я назвал' myplots'. – keegan

+0

отлично, большое спасибо за вашу помощь! –