Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert data.frame to zoo

Tags:

r

statistics

zoo

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

like image 352
user2051347 Avatar asked Jan 01 '14 20:01

user2051347


2 Answers

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.

like image 184
G. Grothendieck Avatar answered Nov 01 '22 00:11

G. Grothendieck


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)
}
like image 36
SwissArmy1984 Avatar answered Oct 31 '22 23:10

SwissArmy1984