0

When I use the list function:

el_nino_1974_2000_all <- list()
for (k in seq_along(el_nino_start_month)){
     el_nino_1974_2000_all[[k]] = window(Nino3.4_Flow_1974_2000_zoo,
                                         start = (as.Date(el_nino_1974_2000[k,]$el_nino_start_mont)),
                                         end = (as.Date(el_nino_1974_2000[k,]$el_nino_finish_month)))
}

A gives a series of separate data subsets staring from i = 1. However, I want to merge all subsets into one frame of data either in zoo format or data frame format.

This is the structure of el_nino_1974_2000_all.

    > str(el_nino_1974_2000_all)
List of 7
 $ :‘zoo’ series from 1976-08-15 to 1977-01-15
  Data: num [1:6, 1:2] 0.519 0.874 0.886 0.823 0.734 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:6], format: "1976-08-15" "1976-09-15" ...
 $ :‘zoo’ series from 1982-05-15 to 1983-06-15
  Data: num [1:14, 1:2] 0.961 1.388 0.959 1.171 1.564 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:14], format: "1982-05-15" "1982-06-15" ...
 $ :‘zoo’ series from 1986-09-15 to 1988-01-15
  Data: num [1:17, 1:2] 0.974 1.089 1.322 1.273 1.313 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:17], format: "1986-09-15" "1986-10-15" ...
 $ :‘zoo’ series from 1991-05-15 to 1992-07-15
  Data: num [1:15, 1:2] 0.68 1 0.923 0.773 0.68 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:15], format: "1991-05-15" "1991-06-15" ...
 $ :‘zoo’ series from 1993-02-15 to 1993-07-15
  Data: num [1:6, 1:2] 0.54 0.641 1.01 1.144 0.917 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:6], format: "1993-02-15" "1993-03-15" ...
 $ :‘zoo’ series from 1994-08-15 to 1995-02-15
  Data: num [1:7, 1:2] 0.662 0.746 1.039 1.329 1.301 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:7], format: "1994-08-15" "1994-09-15" ...
 $ :‘zoo’ series from 1997-04-15 to 1998-05-15
  Data: num [1:14, 1:2] 0.601 1.136 1.461 1.668 2.079 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:2] "Nino3.4_degree_1974_2000" "Houlgrave_flow_1974_2000"
  Index:  Date[1:14], format: "1997-04-15" "1997-05-15" ...
> 

Sorry, I don't know how to do the formatting.

joran
  • 169,992
  • 32
  • 429
  • 468
Yu Deng
  • 1,051
  • 4
  • 18
  • 35
  • A user has suggested this is very similar to http://stackoverflow.com/questions/5942760/most-efficient-list-to-data-frame-method -- I can't tell -- so it might also contain useful information for you. – sarnold Jan 22 '12 at 03:46

2 Answers2

1

If the dates don't overlap, you can stick these together using rbind (since the number of columns is the same for each component). Try:

el_nino_1974_2000_all <- c()
for (k in seq_along(el_nino_start_month)){
    el_nino_1974_2000_all <- rbind(el_nino_1974_2000_all,window(...))
}

Instead of the list construction you originally had. This will return a zoo object.

If you want to return a data.frame, try using rbind, but with data.frame to convert your objects (this will work even if date indices overlap between each of your datasets):

el_nino_1974_2000_all <- data.frame()
for (k in seq_along(el_nino_start_month)){
    el_nino_1974_2000_all <- rbind(el_nino_1974_2000_all,data.frame(window(...)))
}
mathematical.coffee
  • 55,977
  • 11
  • 154
  • 194
0

Have you tried this function :

http://rss.acs.unt.edu/Rdoc/library/gtools/html/smartbind.html

out <- smartbind(list_of_dataframes)

Note : list_of_dataframes should contain data.frames but you can just transform you're data to dframes on the fly and then use this function.

alap
  • 646
  • 1
  • 11
  • 24