On 2020-06-13 01:54 +0200, Rasmus Liland wrote:
> Dear Alejandro,

Sorry, I programmed and wrote that email at 
the same time, changed the “toma_de_muestras” 
perhaps other things, then continued 
programming, thus this might make more 
sense ...

Firstly, it would be easier to help you if 
you provided some example of how 
fusion_de_tablas looks like.

In this first example, I create a small list 
of oddly shaped data.frames which might look 
like your 85-element-long list.  Then, 
determining the unique colnames.  Lastly, 
applying my way through the list again to 
fill in N/A in the columns not there, so the 
do.call function recieves what it expects ... 

        red_tablas_por_punto <-
          list(
            "1 - Bv.Artigas y la Rambla (Terminal CUTCSA)" =
              data.frame("a"=1:3,
                         "b"=4:6,
                         "c"=4:6,
                         'toma_de_muestras'=10001:10003),
            "10 - Avenida Millán 2515 (Hospital Vilardebó)" =
              data.frame("d"=4:8,
                         "b"=8:12,
                         'toma_de_muestras'=10004:10008),
            "100 - Fauquet 6358 (Hospital Saint Bois)" =
              data.frame("e"=100:101,
                         "a"=85:86,
                         'toma_de_muestras'=10009:10010)
          )
        unified.df <- lapply(names(red_tablas_por_punto),
          function(tabla, cn) {
            x <- red_tablas_por_punto[[tabla]]
            x[,cn[!(cn %in% colnames(x))]] <- NA
            x <- x[,cn]
            x$tabla <- tabla
            return(x)
          }, cn=unique(unlist(lapply(red_tablas_por_punto, colnames))))
        unified.df <- do.call(rbind, unified.df)
        unified.df

yields this:

            a  b  c toma_de_muestras  d   e                                     
    tabla
        1   1  4  4            10001 NA  NA  1 - Bv.Artigas y la Rambla 
(Terminal CUTCSA)
        2   2  5  5            10002 NA  NA  1 - Bv.Artigas y la Rambla 
(Terminal CUTCSA)
        3   3  6  6            10003 NA  NA  1 - Bv.Artigas y la Rambla 
(Terminal CUTCSA)
        4  NA  8 NA            10004  4  NA 10 - Avenida Millán 2515 (Hospital 
Vilardebó)
        5  NA  9 NA            10005  5  NA 10 - Avenida Millán 2515 (Hospital 
Vilardebó)
        6  NA 10 NA            10006  6  NA 10 - Avenida Millán 2515 (Hospital 
Vilardebó)
        7  NA 11 NA            10007  7  NA 10 - Avenida Millán 2515 (Hospital 
Vilardebó)
        8  NA 12 NA            10008  8  NA 10 - Avenida Millán 2515 (Hospital 
Vilardebó)
        9  85 NA NA            10009 NA 100      100 - Fauquet 6358 (Hospital 
Saint Bois)
        10 86 NA NA            10010 NA 101      100 - Fauquet 6358 (Hospital 
Saint Bois)

... right, so you could also use merge with 
Reduce like in that stackoverflow answer [1], 
which might have been what you were looking 
for anyway:

        Reduce(function(x, y)
          merge(x, y, by='toma_de_muestras', all=T),
          red_tablas_por_punto)

yields this:

           toma_de_muestras a.x b.x  c  d b.y   e a.y
        1             10001   1   4  4 NA  NA  NA  NA
        2             10002   2   5  5 NA  NA  NA  NA
        3             10003   3   6  6 NA  NA  NA  NA
        4             10004  NA  NA NA  4   8  NA  NA
        5             10005  NA  NA NA  5   9  NA  NA
        6             10006  NA  NA NA  6  10  NA  NA
        7             10007  NA  NA NA  7  11  NA  NA
        8             10008  NA  NA NA  8  12  NA  NA
        9             10009  NA  NA NA NA  NA 100  85
        10            10010  NA  NA NA NA  NA 101  86

Best,
Rasmus

[1] 
https://stackoverflow.com/questions/22644780/merging-multiple-csv-files-in-r-using-do-call

Attachment: signature.asc
Description: PGP signature

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to