Home > Back-end >  Adding Rows To a Contingency Table
Adding Rows To a Contingency Table

Time:01-11

I am using R. I have the following three data sets:

set.seed(123)

v1 <- c("2010-2011","2011-2012", "2012-2013", "2013-2014", "2014-2015") 
v2 <- c("A", "B", "C", "D", "E")
v3 <- c("Z", "Y", "X", "W" )

data_1 = data.frame(var_1 = rnorm(871, 10,10), var_2 = rnorm(871, 5,5))

data_1$dates <- as.factor(sample(v1, 871, replace=TRUE, prob=c(0.5, 0.2, 0.1, 0.1, 0.1)))

data_1$types <- as.factor(sample(v2, 871, replace=TRUE, prob=c(0.3, 0.2, 0.1, 0.1, 0.1)))

data_1$types2 <- as.factor(sample(v3, 871, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))


data_2 = data.frame(var_1 = rnorm(412, 10,10), var_2 = rnorm(412, 5,5))

data_2$dates <- as.factor(sample(v1, 412, replace=TRUE, prob=c(0.5, 0.2, 0.1, 0.1, 0.1)))

data_2$types <- as.factor(sample(v2, 412, replace=TRUE, prob=c(0.3, 0.2, 0.1, 0.1, 0.1)))

data_2$types2 <- as.factor(sample(v3, 412, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))

data_3 = data.frame(var_1 = rnorm(332, 10,10), var_2 = rnorm(332, 5,5))

data_3$dates <- as.factor(sample(v1, 332, replace=TRUE, prob=c(0.5, 0.2, 0.1, 0.1, 0.1)))

data_3$types <- as.factor(sample(v2, 332, replace=TRUE, prob=c(0.3, 0.2, 0.1, 0.1, 0.1)))

data_3$types2 <- as.factor(sample(v3, 332, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))

I combined these 3 data sets and made the following contingency table:

data_1 <- data.frame(name="data_1", data_1)
data_2 <- data.frame(name="data_2", data_2)
data_3 <- data.frame(name="data_3", data_3)

problem_data <- rbind(data_1, data_2, data_3)


summary <- xtabs(~dates name types types2, problem_data)
t = ftable(summary, row.vars=1, col.vars=2:4)

Finally, using the "memisc" library, I was able to "publish" this table using the "show_html()" function:

library(memisc) 
show_html(t)

enter image description here

In the above table, I want to add a row of "totals" for each vertical combination (e.g. A,W , A,X, , A,Y, , A,Z, B,W, ...)

I know how to generate all these totals:

library(dplyr)


#column of totals

totals = problem_data %>% 
    group_by(name,  types, types2) %>% 
    summarise(totals = n())

`summarise()` has grouped output by 'name', 'types'. You can override using the `.groups` argument.
# A tibble: 60 x 4
# Groups:   name, types [15]
   name   types types2 totals
   <chr>  <fct> <fct>   <int>
 1 data_1 A     W          26
 2 data_1 A     X          29
 3 data_1 A     Y         172
 4 data_1 A     Z         104
 5 data_1 B     W          27
 6 data_1 B     X          20
 7 data_1 B     Y         111
 8 data_1 B     Z          48
 9 data_1 C     W          12
10 data_1 C     X          10
# ... with 50 more rows

These can also be transposed to make it easier:

library(data.table)
 transpose(totals)
      V1     V2     V3     V4     V5     V6     V7     V8     V9    V10    V11    V12    V13    V14    V15    V16    V17    V18    V19    V20    V21    V22    V23    V24    V25    V26    V27
1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_1 data_2 data_2 data_2 data_2 data_2 data_2 data_2
2      A      A      A      A      B      B      B      B      C      C      C      C      D      D      D      D      E      E      E      E      A      A      A      A      B      B      B
3      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y
4     26     29    172    104     27     20    111     48     12     10     64     32     12     10     43     33     15      9     56     38     13     14     80     54      9     12     56

     V28    V29    V30    V31    V32    V33    V34    V35    V36    V37    V38    V39    V40    V41    V42    V43    V44    V45    V46    V47    V48    V49    V50    V51    V52    V53    V54
1 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_2 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3 data_3
2      B      C      C      C      C      D      D      D      D      E      E      E      E      A      A      A      A      B      B      B      B      C      C      C      C      D      D
3      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X      Y      Z      W      X
4     35      5      4     25     18      3      2     16     14      8      4     27     13      6     11     62     48      7     12     38     24      6      2     20      8 
 6      5
     V55    V56    V57    V58    V59    V60
1 data_3 data_3 data_3 data_3 data_3 data_3
2      D      D      E      E      E      E
3      Y      Z      W      X      Y      Z
4     19     14      7      3     27      7

But can someone please show me how these totals can be added to the bottom row of the earlier contingency table "t" ? Is there a way to do this directly using the "xtabs" and the "ftable" commands?

Thanks!

CodePudding user response:

You can do that by rbind(your_ftable, total = ...). This will create a row with the name total after the last row of your_ftable. For instance,

summary <- xtabs(~dates name types types2, problem_data)
t <- ftable(summary, row.vars=1, col.vars=2:4)
totals <- problem_data %>% group_by(name,  types, types2) %>% summarise(totals = n())
memisc::show_html(rbind(t, totals = totals$totals), varinfront = FALSE)

gives

result

Further reading: enter image description here

  •  Tags:  
  • Related