rarrayslistcbind

How to column-bind frequency tables with different column numbers?


I have a frequency table that has different column numbers. I am using the following code but it is not resulting in accurate results.

data_cbind <- cbind(table_45_1, table_45_3, table_45_6 table_45_12) 

head(table_45_1)
 1  2  3 
30  4  1 

head(table_45_3)
 1  2  3  4 
10  8  1  1 

head(table_45_6)
 1  2 
 12  5

head(table_45_12)
 1   
 1  

I want to organize the data as follows:

enter image description here

data

table_45_1 <- structure(c(`1` = 30L, `2` = 4L, `3` = 1L), dim = 3L, dimnames = structure(list( c("1", "2", "3")), names = ""), class = "table")
table_45_3 <- structure(c(`1` = 10L, `2` = 8L, `3` = 1L, `4` = 1L), dim = 4L, dimnames = structure(list( c("1", "2", "3", "4")), names = ""), class = "table")
table_45_6 <- structure(c(`1` = 12L, `2` = 5L), dim = 2L, dimnames = structure(list( c("1", "2")), names = ""), class = "table")
table_45_12 <- structure(c(`1` = 1L), dim = 1L, dimnames = structure(list("1"), names = ""), class = "table")

Solution

  • Here's a way to rbind frequency "table"s with unequal lengths. Essentially we add an id column and reshape.

    mget(l <- ls(pattern='table_')) |>
      lapply(as.data.frame) |>
      Map(`[<-`, x=_, 'id', value=l) |>
      suppressWarnings() |>  ## *
      do.call(what='rbind') |>
      reshape(direction='wide', timevar='Var1', new.row.names=l) |>
      subset(select=-id) |>
      t()
    #        table_45_1 table_45_12 table_45_3 table_45_6
    # Freq.1         30           1         10         12
    # Freq.2          4          NA          8          5
    # Freq.3          1          NA          1         NA
    # Freq.4         NA          NA          1         NA
    

    *As for the warning, see here.


    Data:

    table_45_1 <- structure(c(`1` = 30L, `2` = 4L, `3` = 1L), dim = 3L, dimnames = structure(list( c("1", "2", "3")), names = ""), class = "table")
    table_45_3 <- structure(c(`1` = 10L, `2` = 8L, `3` = 1L, `4` = 1L), dim = 4L, dimnames = structure(list( c("1", "2", "3", "4")), names = ""), class = "table")
    table_45_6 <- structure(c(`1` = 12L, `2` = 5L), dim = 2L, dimnames = structure(list( c("1", "2")), names = ""), class = "table")
    table_45_12 <- structure(c(`1` = 1L), dim = 1L, dimnames = structure(list("1"), names = ""), class = "table")