zoo objects are intended to represent time series and are
based on vectors and matrices, like ts objects, not data frames.
See ?zoo
Create your new columns as numeric variables:
> library(zoo)
> library(chron) # need chron 2.3-16 for month.day.year
> z <- zoo(matrix(1:24, 6, 4), Sys.Date() + seq(0, length = 6, by = 32)) #
test data
> # add year, month and day as columns to z
> with(month.day.year(time(z)), cbind(z, year, month, day, quarter = (month -
1) %/% 3 + 1, dow = as.numeric(format(time(z), "%w"))))
z.1 z.2 z.3 z.4 year month day quarter dow
2007-12-24 1 7 13 19 2007 12 24 4 1
2008-01-25 2 8 14 20 2008 1 25 1 5
2008-02-26 3 9 15 21 2008 2 26 1 2
2008-03-29 4 10 16 22 2008 3 29 1 6
2008-04-30 5 11 17 23 2008 4 30 2 3
2008-06-01 6 12 18 24 2008 6 1 2 0
On Dec 24, 2007 8:30 AM, Alex Park <alex.park1 at ntlworld.com>
wrote:> R
>
> I get a daily feed of data over the internet that I keep in various .csv
> files.
>
> I have built a function that reads that data into R for me:
>
> getMarketData<-function(market)
> {
> library(zoo)
> pathname<- "C:/DATA/"
>
files<-c("AN_REV.csv","AX_REV.csv","BN_REV.csv")
> markets<-c("AUS","DAX","GBP")
>
df<-read.zoo(paste(pathname,files[match(market,markets)],sep=""),
> index.column=1, format="%m/%d/%Y", header=F, sep=",")
> df
> }
>
> This works fine and returns the dataset as planned:
>
> V2 V3 V4 V5 V6 V7
> 1990-01-02 54.89 54.99 54.61 54.61 125 2576
> 1990-01-03 54.48 54.62 54.29 54.33 1495 3232
> 1990-01-04 54.67 55.20 54.59 55.08 932 3145
> 1990-01-05 54.64 54.87 54.57 54.57 272 2567
> 1990-01-08 54.87 54.89 54.68 54.79 177 2456
> 1990-01-09 54.87 54.96 54.80 54.88 106 2403
>
> Also if I type the following:
>
> mode(df[1,1])
>
> >"numeric"
>
> That is, my data is treated as numeric (which is as it should be).
>
> Here is where I get a problem. I'd like to add some more columns on to
the
> end of the dataset to represent the year, quarter, month, and day.
>
> If I try the following within the function it won't work:
>
> df<-transform(df, "Year"=format(time(df), "%Y"))
>
> Curiously, if I do exactly the same line by line in R (i.e. without
> specifying a function) then it works fine. Is there any reason why I cannot
> use transform in a function?
>
> I also tried a different approach as shown below i.e within my original
> function I added the following lines after I had created df:
>
> df[,8:11]<-0
> df[,7]<-format(time(df), format="%Y")
> df[,8]<-quarters(time(df))
> df[,9]<-months(time(df))
> df[,10]<-weekdays(time(df))
>
> This worked fine however it changed all my data from numeric to character:
>
> Open High Low Close Volume OI Year Quarter Month Day
>
> 1990-01-02 54.89 54.99 54.61 54.61 125 2576 1990 Q1 January Tuesday
>
> 1990-01-03 54.48 54.62 54.29 54.33 1495 3232 1990 Q1 January
Wedesday
> 1990-01-04 54.67 55.2 54.59 55.08 932 3145 1990 Q1 January
Thursday
>
> 1990-01-05 54.64 54.87 54.57 54.57 272 2567 1990 Q1 January Friday
>
> 1990-01-08 54.87 54.89 54.68 54.79 177 2456 1990 Q1 January Monday
>
> 1990-01-09 54.87 54.96 54.8 54.88 106 2403 1990 Q1 January Tuesday
>
>
> mode(df[1,1])
>
> >"character"
>
> Why does my numeric data get changed into character?
>
> Can anybody see a simple way to add the data I require whilst retaining the
> "numeric" format?
>
> Regards
>
>
> Alex Park
>
> ______________________________________________
> 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.
>