问题描述
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","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
请注意,它们都是 array
,array
也是具有某些 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)