Search code examples
rlistcbinddata-wrangling

Combining componenets of a list in r


I have a list that contains data by year. I want to combine these components into a single dataframe, which is matched by row. Example list:

    List [[1]]
    State Year   X   Y
    23     1971  etc  etc
    47     1971  etc  etc

    List[[2]]
    State Year   X   Y
    13     1972  etc etc
    23     1973  etc  etc
    47     1973  etc  etc

   etc....

   List[[45]]
     State Year   X   Y
     1     2017  etc etc
     2     2017 etc  etc
     3     2017 etc  etc
     1     2017  etc etc
    23     2017 etc  etc
    47     2017 etc  etc

I want the dataframe to look like (I know I will have to go through and remove some extra columns:

    State   1971_X    1971_Y    1972_X    1972_Y....2018_X    2019_Y
    1         NA        NA       NA        NA         etc       etc
    2         NA        NA       etc       etc        etc       etc   
    3         etc       ect      etc       etc        etc       etc  
    ...
    50        NA        NA       etc        etc       etc       etc

I have tried the command Outcomewanted=do.call("cbind", examplelist) but get the message

"Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 36, 40, 20, 42, 38, 26, 17, 31, 35, 23, 33, 13, 29, 28, 32, 34, 41, 37, 43, 39, 30, 14, 10, 4, 7"

It seems that the cbind.fill command could be an option but has been retired? Thanks for any help in advance.


Solution

  • You may use reshape after a do.call(rbind()) manoeuvre.

    res <- reshape(do.call(rbind, lst), idvar="state", timevar="year", direction="wide")
    res
    #   state     x.1971    y.1971    x.1972      y.1972     x.1973     y.1973
    # 1    23  1.3709584 0.3631284        NA          NA -0.1061245  2.0184237
    # 2    24 -0.5646982 0.6328626        NA          NA  1.5115220 -0.0627141
    # 3    13         NA        NA 0.4042683 -0.09465904         NA         NA
    

    Data

    lst <- list(structure(list(state = c(23, 24), year = c(1971, 1971), 
        x = c(1.37095844714667, -0.564698171396089), y = c(0.363128411337339, 
        0.63286260496104)), class = "data.frame", row.names = c(NA, 
    -2L)), structure(list(state = c(13, 23, 24), year = c(1972, 1973, 
    1973), x = c(0.404268323140999, -0.106124516091484, 1.51152199743894
    ), y = c(-0.0946590384130976, 2.01842371387704, -0.062714099052421
    )), class = "data.frame", row.names = c(NA, -3L)))