Постройте несколько скользящих средних для нескольких наборов данных на одном графике

У меня есть кадр данных, который состоит из 3 столбцов: время, A, B. Мне удалось построить (A и B) время VS на одном графике. Я хотел бы рассчитать скользящее среднее для A, B и построить его на том же графике. Я нашел похожий вопрос, однако он для одиночных данных. Я выполнил те же шаги, но не смог объединить скользящее среднее A и B на одном графике, чтобы сделать его кратным.

Пример моего фрейма данных:

time,A,B
0.122096,1,0
0.207928,9,0
0.300415,17,30
0.400383,30,60
0.503295,26,50
0.606207,24,70
1.05641,7,50
1.066232,1,56
1.068054,1,60
1.072752,1,76
1.107066,5,30
1.209493,16,40
1.301466,33,50

Мой код:

require(reshape2)
require(ggplot2)
library(zoo)
df<-read.csv("DATA.csv")
temp.zoo<-zoo(df$time,df$A)
temp2.zoo<-zoo(df$time,df$B)

m.av<-rollmean(temp.zoo,10)
df$A.av=coredata(m.av)

m2.av<-rollmean(temp2.zoo,10)
df$B.av=coredata(m2.av)

p<-ggplot(dat = melt(df, id.var="time"), aes(x=time, y=value, color = variable)) + 
geom_line(size=0.6) +
// the above line is graphing the two columns(A and B ) VS time .
geom_line(aes(x=df$time,y=df$A.av),color="black") +
geom_line(aes(x=df$time,y=df$B.av),color="grey") 
print(p)

Не знаю, что мне не хватает? Любое предложение?


person SimpleNEasy    schedule 14.07.2013    source источник


Ответы (1)


Первая проблема - в функции zoo() time и A должны располагаться в противоположном порядке.

temp.zoo<-zoo(df$A,df$time)
temp2.zoo<-zoo(df$B,df$time)

Затем для функции rollmean() вы должны добавить аргумент fill=list(NA,NULL,NA), чтобы заполнить начало и конец значениями NA, чтобы получить вектор той же длины, что и исходные данные.

m.av<-rollmean(temp.zoo,10,fill=list(NA,NULL,NA))
df$A.av=coredata(m.av)

m2.av<-rollmean(temp2.zoo,10,fill=list(NA,NULL,NA))
df$B.av=coredata(m2.av)

Теперь вы можете расплавить исходный фрейм данных перед построением графика. Таким образом, для построения графика вам понадобится только один вызов geom_line().

df.long<-melt(df, id.vars="time")

ggplot(data=df.long, aes(time,value,color=variable))+geom_line()
person Didzis Elferts    schedule 14.07.2013
comment
Спасибо, идеально. Мне интересно, если я хочу отображать только результаты скользящего среднего, как мне указать только df $ A и df $ B VS Time. - person SimpleNEasy; 14.07.2013
comment
Один из способов — использовать subset() внутри вызова ggplot(), например, ggplot(data=subset(df.long,variable%in%c(A.av,B.av)),aes(...... - person Didzis Elferts; 14.07.2013