I want to convert a data.frame to a zoo object. My df looks like that:
> (str(StockPriceReturns))
'data.frame': 3036 obs. of 2 variables:
$ Date : Factor w/ 3036 levels "01.01.2002","01.01.2003",..: 1 102 202 301 600 701 802 902 1001 1300 ...
$ TotalReturns: num 183 183 186 191 191 ...
NULL
What I tried:
directly:
Here I am getting an error...
> (z1 <- read.zoo(StockPriceReturns, drop=FALSE))
Error in read.zoo(StockPriceReturns, drop = FALSE) :
index has 3036 bad entries at data rows: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 ...
function:
I am getting an error too ;(
dfToZoo <- function(df) {
require(zoo)
date <- as.Date(df[, 1], format = '%d.%m.%y')
with(df, zoo(date,freq))
}
> (z1 <- dfToZoo(StockPriceReturns))
Error in MATCH(order.by, order.by) : object 'freq' not found
My question is what is a better way to convert a data.frame to a zoo object? How to properly do that?
I appreciate your reply
Regarding the attempt to use read.zoo, the format of the first column must be specified as it differs from the default. See ?read.zoo for proper use of that function. Also there is a vignette vignette("zoo-read") entirely devoted to read.zoo examples.
DF <- data.frame(Date = c("01.01.2002","01.01.2003"), TotalReturns = c(183, 183))
library(zoo)
read.zoo(DF, format = "%d.%m.%Y")
## 2002-01-01 2003-01-01
## 183 183
The function dfToZoo provided in the question uses zoo incorrectly (see ?zoo to understand the arguments) and the value of the format argument should be "%d.%m.%Y" with an upper case Y.
A quick take on a dfTozoo function. It gives you the flexibility of specifying the date format if different from the included default:
dfTozoo = function(tsdataframe, dateformat="%m/%d/%Y"){
library(zoo)
framedates = as.Date(tsdataframe[,1], format=dateformat)
n=ncol(tsdataframe)
zoodata = zoo(tsdataframe[,2:n], order.by=framedates)
return(zoodata)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With