table 和 ftable 有何不同?

How do table and ftable differ?

ftable 的文档告诉我们“ftable 创建‘平面’列联表”。但是,这对我来说意义不大。我在下面放置了两个示例,但它们看起来非常相似,以至于我觉得我完全忽略了 tableftable 之间的区别。我是不是对一些关键的编程或统计思想一无所知?

> 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

我怀疑它的意思是“扁平化”,如“扁平化嵌套列表”,但如果是这样,那么我不确定为什么我不能向 ftable 提供完全相同的参数尽我所能 table。例如,ftable(Titanic, row.vars = 1:3) 是有效的,但 table(Titanic, row.vars = 1:3) 会抛出有关参数长度不等的错误。

如果我们看一下结构,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"

即flat table 是 2D,而 table 是 4D array

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

dim(ftbl1)
#[1] 12  3

请注意,它们都是 array,一个 array 也是一个具有某些 dim 属性的 vector

两者都不是 list。正是这些属性使它们与众不同,以及它们的排列方式。例如如果我们删除属性,它们只是 vector 以不同的值顺序排列

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的错误,就是检查?table

时没有row.vars参数

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)