Hi Doug,
Thanks for taking the time to write a great question.
On Mon, Oct 3, 2011 at 12:23 PM, Douglas Philips <dgou at mac.com>
wrote:> Hello,
> ?I'm a complete newbie to R. Spent this past weekend reading The Art of
R Programming, The R Cookbook, the language spec, Wikis and FAQs. I sort-of have
my head around R; the dizzying selection of libraries, packages, etc? Not
really. I've probably missed or failed to understand something...
>
> ?I have very a simple data set. Two years (ish) of temperature data,
collected and time-stamped every 10 minutes. Sample of the data from
read.csv(...):
>
>> head(temp.data)
> ? ? ? ? ? ?DateTime Temperature
> 1 2009-11-23 23:20:00 ? ? ? ?62.9
> 2 2009-11-23 23:30:00 ? ? ? ?63.4
> 3 2009-11-23 23:40:00 ? ? ? ?63.6
> 4 2009-11-23 23:50:00 ? ? ? ?64.2
> 5 2009-11-24 00:00:00 ? ? ? ?64.5
> 6 2009-11-24 00:10:00 ? ? ? ?64.7
>
> Converted to an xts object:
>> str(temp_data)
> xts [1:83089, 1] 62.9 63.4 63.6 64.2 64.5 64.7 65.2 65.3 65.8 65.6 ...
> - attr(*, "index")= atomic [1:83089] 1.26e+09 1.26e+09 1.26e+09
1.26e+09 1.26e+09 ...
> ?..- attr(*, "tzone")= chr ""
> ?..- attr(*, "tclass")= chr [1:2] "POSIXct"
"POSIXt"
> - attr(*, "class")= chr [1:2] "xts" "zoo"
> - attr(*, ".indexCLASS")= chr [1:2] "POSIXct"
"POSIXt"
> - attr(*, ".indexTZ")= chr ""
>
>
> So far so good! I can do all kinds of cool things like plot individual
months: plot(temp_data["2009-12"]) and plot monthly, weekly, daily
mean, sd, etc. (I have to say, xts has been a dream to work with!)
>
> What I would like to do is plot several sections of this data on the same
graph.
> Specifically, I would like to plot all the data from one calendar month,
regardless of year, on one plot.
> i.e. one line for ?Jan 2009, another line for Jan 2010, anothe line for Jan
2011, etc.
>
> I can use xts functions to slice the data into months (or weeks, or days),
but I am not sure how to arrange to get the X-axis to work right. If I do:
> ? plot(temp_data["2010-01"]);
lines(temp_data("2011-01"))
> lines aren't overlayed; the output from lines() is lost because it is
far off of the right of the plot as the plot autoranged() the x and y axes. But
I don't think xlim is my problem so much as I need a way to 'slide'
temp_data["2011-01"] so that it will appear in the same part of the
graph/plot as the 2010-01 data does.
>
> What I think I want to do is write a "normalizing" function that
takes data for any given month and makes it "year-free"??? This way I
could plot corresponding months on the same graph. One month, or a quarter, or
even a full year. I don't know, however, how to convince xts to ignore the
year, or if there is an xts compatible object that is year-free (or month-free
for looking at week/day segements)...
>
xts requires a time-based index, so there's no way to make an index
"year-free". What you can do, is split the xts object into years,
convert all the index values to have the same year, and merge them
together.
The "toyear" function I've provided below converts the index
values to
a specific year. A "month-free" solution would be similar. I'd
also
recommend using plot.zoo for more complex graphs.
toyear <- function(x, year) {
# get year of last obs
xyear <- .indexyear(last(x))+1900
# get index and convert to POSIXlt
ind <- as.POSIXlt(index(x))
# set index year to desired value
ind$year <- year-1900
index(x) <- ind
# label column with year of last obs
colnames(x) <- paste(colnames(x),xyear,sep=".")
x
}
# split data into a list of xts objects by year
tmp_dat_yr_list <- split(temp_data, "years")
# convert each list element to be "2011"
tmp_dat_yr_list <- lapply(tmp_dat_yr_list, toyear, 2011)
# merge all list elements into one object
temp_data_by_year <- do.call(merge, tmp_dat_yr_list)
# plot.zoo has more features than plot.xts at the moment
plot.zoo(temp_data_by_year, screens=1,
col=rainbow(ncol(temp_data_by_year)))
> Pointers to online answers, google search terms, etc. greatly appreciated!
>
> Thanks,
> ?-=Doug
>
Best,
--
Joshua Ulrich | FOSS Trading: www.fosstrading.com