table 和 ftable 有何不同?

问题描述

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","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,gear = 4

   vs
cyl  0  1
  4  0  2
  6  0  2
  8  0  0,gear = 4

   vs
cyl  0  1
  4  0  6
  6  2  0
  8  0  0,gear = 5

   vs
cyl  0  1
  4  0  0
  6  0  0
  8  0  0,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: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","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

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

两者都不是 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中的错误,只是如果我们检查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,row.vars = NULL,col.vars = NULL)