0

Consider the list below.

lst <- list()
lst[[1]] <- data.frame(category = c(1:10), freq = rnorm(10))
lst[[2]] <- data.frame(category = seq(4,26,2), freq = rnorm(12))
lst[[3]] <- data.frame(category = 2:8, freq = rnorm(7))

How can I merge the data frames in this list by $category, given they have different dimensions and levels, producing a data.frame like the one below?

category  freq.1      freq.2     freq.3
    1   1.2496154         NA         NA
    2  -1.3537722         NA -1.3257535
    3  -0.3976305         NA  0.5761957
    4   0.7721428 -0.2360636 -1.0953490
    5   0.7653834         NA  0.9037617
    6   0.2192559 -0.2543082 -1.6640824
    7   0.3400192         NA -1.2961707
    8  -0.8457081 -0.7431021  0.9321560
    9  -1.2132615         NA         NA
   10   1.8387899  0.8342264         NA
   12          NA -0.5409164         NA
   14          NA  0.1638546         NA
   16          NA  0.6420546         NA
   18          NA -0.5110151         NA
   20          NA -0.8262690         NA
   22          NA  1.2406462         NA
   24          NA -1.1497992         NA
   26          NA -0.4338807         NA
vitor
  • 1,240
  • 2
  • 13
  • 27

1 Answers1

7
Reduce(function(x, y) merge(x, y, by = 'category', all = TRUE), lst)
eddi
  • 49,088
  • 6
  • 104
  • 155
  • if I add "lst[[4]] <- data.frame(category = 0:10, freq = rnorm(11))", I get the error message: "Error in match.names(clabs, names(xi)) : names do not match previous names" – vitor Nov 13 '13 at 20:00
  • 1
    @aguiar that's strange - I don't know what's going on, but perhaps it's related to this issue: http://stackoverflow.com/q/8898905/817778 – eddi Nov 13 '13 at 20:18
  • 1
    As a workaround, you can rename your columns before-hand: `for (i in seq_along(lst)) names(lst[[i]]) <- c('category', paste0('freq.', i))` – eddi Nov 13 '13 at 20:26