On Wed, Aug 1, 2012 at 12:54 PM, Douglas Karabasz
<douglas at sigmamonster.com> wrote:> I used quantmod to pull in price data from the ticker SPY. The data has
> date and closing price. I would like to show the day of the week for each
> closing price. Is that possible? Also, I would like to add the back into
> the data frame in a new column without changing the structure of the data
> set if possible.
>
>
>
> SPY
>
> 2009-01-02 92.96
>
> 2009-01-05 92.85
>
> 2009-01-06 93.47
>
> 2009-01-07 90.67
>
> 2009-01-08 91.04
>
> 2009-01-09 89.09
>
>
>
>> str(SP500)
>
> An 'xts' object from 2009-01-02 to 2012-07-31 containing:
>
> Data: num [1:902, 1] 93 92.8 93.5 90.7 91 ...
>
> - attr(*, "dimnames")=List of 2
>
> ..$ : NULL
>
> ..$ : chr "SPY"
>
> Indexed by objects of class: [Date] TZ:
>
> xts Attributes:
>
> List of 4
>
> $ tclass : chr [1:2] "POSIXct" "POSIXt"
>
> $ tzone : chr ""
>
> $ src : chr "yahoo"
>
> $ updated: POSIXct[1:1], format: "2012-07-31 17:59:16"
>
Hi Doug,
No, this isn't quite doable. I'll give a somewhat technical
description of why and then I'll propose a work around
---- Technical Stuff ---
An "xts" object consists of two fundamental parts -- an index which is
numeric (seconds since the epoch usually) and its "coredata" which is,
in your case, the prices. The "coredata" is and must be all of the
same "type" -- either integer, double, or string; internally, this is
because it's all actually a matrix, which is in turn an atomic vector,
and to be any sort of performant, we need them all of the same type.
So there's no way for the coredata to have the _number_ 24 and the
_string_ day of the week "tuesday". We'll come back to this
though.
So you might ask about the index... xts hard-codes selected index
classes to work. None of them currently have printing methods that
write out the day of the week like you want, though you could define
your own time index and use it in zoo if desired. That's almost
certainly overkill though.
---- What to do ----
In light of the above, the easiest thing is probably to encode the day
of the week as an integer if you really need it for calculations:
as.numeric(factor(strptime(index(x), "%A")))
will create that and then you can cbind() it on.
Alternatively, you can cbind() just strptime(index(... on and you will
change the coredata() to character. I'd do this instead if you're only
looking for human output. Even better on the "just look" pretty front
would be to make it into a data.frame for printing only:
data.frame(x, `Day of the Week` = strptime(index(x), "%A"))
but again -- that's only for printing: it will destroy the
"xts"-ness.
Best,
Michael
>
>
> Thank you,
>
> Douglas
>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.