Чем отличаются table и ftable?

В документации для ftable сказано, что ftable создает «плоские» таблицы сопряженности. Однако смысл этого до меня не доходит. Я разместил два примера ниже, но они выглядят настолько похожими, что мне кажется, что я полностью упускаю различие между table и ftable. Я не знаком с каким-то критическим программированием или статистической идеей?

> ftable(mtcars[c("cyl", "vs", "am", "gear")])
          gear  3  4  5
cyl vs am              
4   0  0        0  0  0
       1        0  0  1
    1  0        1  2  0
       1        0  6  1
6   0  0        0  0  0
       1        0  2  1
    1  0        2  2  0
       1        0  0  0
8   0  0       12  0  0
       1        0  0  2
    1  0        0  0  0
       1        0  0  0
> table(mtcars[c("cyl", "vs", "am", "gear")])
, , am = 0, gear = 3

   vs
cyl  0  1
  4  0  1
  6  0  2
  8 12  0

, , am = 1, gear = 3

   vs
cyl  0  1
  4  0  0
  6  0  0
  8  0  0

, , am = 0, gear = 4

   vs
cyl  0  1
  4  0  2
  6  0  2
  8  0  0

, , am = 1, gear = 4

   vs
cyl  0  1
  4  0  6
  6  2  0
  8  0  0

, , am = 0, gear = 5

   vs
cyl  0  1
  4  0  0
  6  0  0
  8  0  0

, , am = 1, gear = 5

   vs
cyl  0  1
  4  1  1
  6  1  0
  8  2  0

Я подозреваю, что это означает плоский, как в flattern, вложенный список, но если это так, то я не уверен, почему я не могу передать точно такие же аргументы ftable, как я могу table. Например, ftable(Titanic, row.vars = 1:3) допустимо, но table(Titanic, row.vars = 1:3) выдает ошибку о том, что аргументы имеют неравную длину.


person J. Mini    schedule 06.03.2021    source источник
comment
Второй представляет собой массив 4D   -  person akrun    schedule 06.03.2021
comment
@akrun Я не думаю, что это просто удобство печати. Смотрите мое последнее редактирование.   -  person J. Mini    schedule 06.03.2021
comment
Я имел в виду, что размеры ftable и таблицы, которую вы построили, различны.   -  person akrun    schedule 06.03.2021


Ответы (1)


Если мы посмотрим на структуру, то это видно из атрибутов dim

tbl1 <- table(mtcars[c("cyl", "vs", "am", "gear")])

str(tbl1)
 'table' int [1:3, 1:2, 1:2, 1:3] 0 0 12 1 2 0 0 0 0 0 ...
 - attr(*, "dimnames")=List of 4
  ..$ cyl : chr [1:3] "4" "6" "8"
  ..$ vs  : chr [1:2] "0" "1"
  ..$ am  : chr [1:2] "0" "1"
  ..$ gear: chr [1:3] "3" "4" "5"

ftbl1 <- ftable(mtcars[c("cyl", "vs", "am", "gear")])
str(ftbl1)
 'ftable' int [1:12, 1:3] 0 0 1 0 0 0 2 0 12 0 ...
 - attr(*, "row.vars")=List of 3
  ..$ cyl: chr [1:3] "4" "6" "8"
  ..$ vs : chr [1:2] "0" "1"
  ..$ am : chr [1:2] "0" "1"
 - attr(*, "col.vars")=List of 1
  ..$ gear: chr [1:3] "3" "4" "5"

то есть плоская таблица - это 2D, а table - это 4D-массив

dim(tbl1)
#[1] 3 2 2 3

dim(ftbl1)
#[1] 12  3

Обратите внимание, что оба они array, а array также является vector с некоторыми атрибутами dim.

Оба не list. Это атрибуты, которые делают их разными, и то, как они устроены. например если мы удалим атрибуты, они будут просто vectors расположены в другом порядке значений

c(ftbl1)
#[1]  0  0  1  0  0  0  2  0 12  0  0  0  0  0  2  6  0  2  2  0  0  0  0  0  0  1  0  1  0  1  0  0  0  2  0  0
c(tbl1)
#[1]  0  0 12  1  2  0  0  0  0  0  0  0  0  0  0  2  2  0  0  2  0  6  0  0  0  0  0  0  0  0  1  1  2  1  0  0

Проверьте, не является ли это list

is.list(tbl1)
#[1] FALSE
is.list(ftbl1)
#[1] FALSE

Что касается ошибки в table, просто у нее нет аргумента row.vars, если мы проверим ?table

table(..., exclude = if (useNA == no) c(NA, NaN), useNA = c(no, ifany, always), dnn = list.names(...), deparse.level = 1)

тогда как ?ftable

ftable(..., exclude = c(NA, NaN), row.vars = NULL, col.vars = NULL)

person akrun    schedule 06.03.2021