2016-05-14 7 views
1

私は同様の質問が回答されたと理解しています。私の問題は、私は15分間隔で2033日間の時系列データを持っているということです。私は毎日(Mon-Sun)のシリーズをプロットしたいと思います。例えば平均的な月曜日の様子。xts - 週の各日にサブセットする方法

.indexwdayを使用してサブセットを作成しようとしましたが、その日のシリーズの開始時間は13:00です。

私は初心者ですから、詳細をお知らせください。

サンプルデータ(XTS)

  • 2008-01-01夜12時00分00秒16
  • 2008-01-01夜12時15分00秒56
  • 2008-01-01 00: 30:00 136
  • 2008-01-01午前0時45分00秒170
  • 2008-01-01午前1時00分00秒132

....

  • 2013年7月25日午後10時30分00秒95
  • 2013年7月25日夜10時45分00秒82
  • 2013年7月25日午後11時00分00秒66
  • 2013から07 -25夜11時15分00秒65​​
  • 2013年7月25日午後十一時30分00秒66
  • 2013年7月25日23時45分○○秒46

プロットは、以下のより多くの意味を作るかもしれないもの私は欲しい(これはすべての月曜日の平均です)

enter image description here

+0

それが共有に敏感でなければ、あなたのデータのスニペットを提供してもらえますか?それが起こった場合は、次元と構造が似ているものを提供してください。 – Abdou

答えて

3

xtsやzoo以外のパッケージに依存しない別の解決方法があります。 ylim力同じy軸の範囲を持つ各プロットの設定

# example data 
ix <- seq(as.POSIXct("2008-01-01"), as.POSIXct("2013-07-26"), by="15 min") 
set.seed(21) 
x <- xts(sample(200, length(ix), TRUE), ix) 

# aggregate by 15-minute observations for each weekday 
a <- lapply(split.default(x, format(index(x), "%A")),   # split by weekday 
    function(x) aggregate(x, format(index(x), "%H:%M"), mean)) # aggregate by 15-min 
# merge aggregated data into one zoo object, ordering columns 
z <- do.call(merge, a)[,c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")] 
# convert index to POSIXct to make plotting easier 
index(z) <- as.POSIXct(index(z), format="%H:%M") 
# plot 
plot(z, type="l", nc=1, ylim=range(z), main="Average daily volume", las=1) 

。それ以外の場合は、それぞれのシリーズに依存するため、値が大きく変わると比較が困難になることがあります。

enter image description here

1

これを試してみてください:

#Get necessary packages 
install.packages("lubridate") 
install.packages("magrittr") 
install.packages("dplyr") 
install.packages("ggplot2") 
install.packages("scales") 

#Import packages 
library(lubridate,warn=F) 
library(dplyr,warn=F) 
library(magrittr) 
library(ggplot2,warn=F) 
library(scales, warn=F) 

#Getting the data 
tstart = as.POSIXct('2008-01-01 00:00:00') 
tend = as.POSIXct('2013-07-25 23:45:00') 
ttimes <- seq(from = tstart,to=tend,by='15 mins') 
tvals <- sample(seq(1,200),length(ttimes),T) 
tsdata <- data.frame(Dates=ttimes,Vals=tvals) 
tsdata <- tsdata %>% mutate(DayofWeek = wday(Dates,label=T), Hours = as.POSIXct(strftime(Dates,format="%H:%M:%S"),format="%H:%M:%S")) 

#Pick a day at a time. I am using Mondays for this example. 
tsdata_monday <- tsdata %>% filter(DayofWeek=='Mon') %>% group_by(Hours) %>% summarise(meanVals=mean(Vals)) %>% as.data.frame() 

#Plotting the graph of mean values versus times for Monday: 
ggplot(tsdata_monday) + aes(x=Hours,y=meanVals) + geom_line() + scale_x_datetime(breaks=date_breaks("4 hour"), labels=date_format("%H:%M")) 

Monday plot

#If you want you can go ahead and plot all the days. But please keep in mind 
#that this does not look good at all. Too many plots for the plot window to 
#Display nicely. 
alltsdata <- tsdata %>% group_by(DayofWeek, Hours) %>% summarise(MeanVals=mean(Vals)) %>% as.data.frame() 

ggplot(alltsdata) + aes(x=Hours,y=MeanVals) + geom_line() + scale_x_datetime(breaks=date_breaks("4 hour"), labels=date_format("%H:%M")) + facet_grid(.~DayofWeek) 

Full plot

を私はあなたが一度に1日、プロットやapply機能のfor loopまたは1つを使用することをお勧め取得するためのバリエーションeプロット。

また、曜日によってフィルタリングするとき、次のように日数が短縮されていることに注意してください。

unique(tsdata$DayofWeek) 
[1] Tues Wed Thurs Fri Sat Sun Mon 

はそれがお役に立てば幸いです。

0

apply.dailyあなたが欲しいものを正確に行います。(あなたのデータはd.xtsと呼ばれ、XTS-オブジェクトさassumming)

apply.daily(d.xts,sum) 

別の解決策はaggregateを使用することになります。答えは少し異なっていること

aggregate(d.xts,as.Date(index(d.xts)),sum) 

注:start(d.xts) to end(d.xts)からapply.daily開始をaggregateが経つのに対し、真夜中から深夜まで

関連する問題