向意外事件添加行 Table

Adding Rows To a Contingency Table

我用的是R,我有以下三个数据集:

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)))

我结合了这3个数据集,做了如下的应急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)

最后,使用“memisc”库,我能够使用“show_html()”函数“发布”这个table:

library(memisc) 
show_html(t)

在上面的table中,我想为每个垂直组合(例如 A,W , A,X, , A,Y, , A ,Z, B,W, ...)

我知道如何生成所有这些总数:

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

这些也可以调换以使其更容易:

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

但是有人可以告诉我如何将这些总数添加到早期意外事件 table“t”的底行吗?有没有办法直接使用“xtabs”和“ftable”命令来做到这一点?

谢谢!

您可以在 rbind(your_ftable, total = ...) 之前完成。这将在 your_ftable 的最后一行之后创建一个名为 total 的行。例如,

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)

给予

进一步阅读:https://cran.r-project.org/web/packages/memisc/vignettes/ftable-matrix.html

使用group_by需要一个人来弄清楚变量出现的顺序。相反,我更愿意使用 addmargins 函数。这将边距添加到数据中。唯一的技巧是更改属性:

v <- attributes(t)
result <- addmargins(t, 1) #Adds the totals
v$row.vars[[1]] <- c(v$row.vars[[1]], 'Total')
v$dim <- dim(result)
attributes(result) <- v
memisc::show_html(result)