Я использую ftable, чтобы создать такую таблицу:

                HPV-16 negative positive
Sex    HPV-55                           
female negative            2341        4
       positive              11        0
male   negative            2140       23
       positive              25        2

Вот код dput.

structure(c(2341L, 11L, 2140L, 25L, 4L, 0L, 23L, 2L), .Dim = c(4L, 
2L), class = "ftable", row.vars = list(Sex = c("female", "male"
), `HPV-55` = c("negative", "positive")), col.vars = list(`HPV-16` = c("negative", 
"positive")))

И пример данных исходных данных:

structure(list(sex = structure(c(2L, 2L, 1L, 1L, 2L, 1L, 2L, 
2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L), .Label = c("female", 
"male"), class = c("labelled", "factor"), label = "sex"), orxh16 = structure(c(1L, 
1L, 1L, NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("negative", "positive"), class = c("labelled", 
"factor"), label = "hpv16"), orxh55 = structure(c(1L, 1L, 1L, 
NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("negative", "positive"), class = c("labelled", 
"factor"), label = "hpv55")), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

Я пробовал addmargins: addmargins(tab1, FUN = list(Total=sum), quiet = T), но подробная информация, например, имена строк и макет, будет потеряна.

              Total
      2341  4  2345
        11  0    11
      2140 23  2163
        25  2    27
Total 4517 29  4546

Мне интересно, есть ли способ добавить общее количество столбцов и строк, и в то же время пусть макет таблицы выглядит как раньше (как показано ниже)? Спасибо!

                HPV-16 negative positive     Total
Sex    HPV-55                           
female negative            2341        4      2345
       positive              11        0       11
male   negative            2140       23      2163
       positive              25        2       27
Total                      4517       29      4546
r
2
YYM17 10 Фев 2020 в 19:57

2 ответа

Лучший ответ

addmargins следует использовать до ftable.

xtab1 <- xtabs(~ sex + orxh55 + orxh16, df)
ftable(addmargins(xtab1, margin = 2:3, list(Total = sum)))

# Margins computed over dimensions
# in the following order:
# 1: orxh55
# 2: orxh16
#                 orxh16 negative positive Total
# sex    orxh55                                 
# female negative              10        0    10
#        positive               0        0     0
#        Total                 10        0    10
# male   negative               9        0     9
#        positive               0        0     0
#        Total                  9        0     9

Пример данных

df <- structure(list(sex = structure(c(2L, 2L, 1L, 1L, 2L, 1L, 2L, 
2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L), .Label = c("female", 
"male"), class = c("labelled", "factor"), label = "sex"), orxh16 = structure(c(1L, 
1L, 1L, NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("negative", "positive"), class = c("labelled", 
"factor"), label = "hpv16"), orxh55 = structure(c(1L, 1L, 1L, 
NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("negative", "positive"), class = c("labelled", 
"factor"), label = "hpv55")), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))
0
Darren Tsai 10 Фев 2020 в 17:51

Просто нашел способ сделать это, используя summarytool :: ctable. Табуляция отделена группирующей переменной, хотя она может предоставлять таблицы, аналогичные приведенным в ftable.

tab2 <- with(hpv2, stby(list(x=orxh55, y=orxh16), 
    sex, ctable, prop="n", useNA="no", dnn = c("HPV_55", "HPV-16")))
Cross-Tabulation  
HPV_55 * HPV-16  
Data Frame: hpv2  
Group: sex = female  

---------- -------- ---------- ---------- -------
             HPV-16   negative   positive   Total
    HPV_55                                       
  negative                2341          4    2345
  positive                  11          0      11
     Total                2352          4    2356
---------- -------- ---------- ---------- -------

Group: sex = male  

---------- -------- ---------- ---------- -------
             HPV-16   negative   positive   Total
    HPV_55                                       
  negative                2140         23    2163
  positive                  25          2      27
     Total                2165         25    2190
2
YYM17 10 Фев 2020 в 17:32