7.2 频数表和列联表
> library(vcd)
> head(Arthritis)
ID Treatment Sex Age Improved
1 57 Treated Male 27 Some
2 46 Treated Male 29 None
3 77 Treated Male 30 None
4 17 Treated Male 32 Marked
5 36 Treated Male 46 Marked
6 23 Treated Male 58 Marked
7.2.1 生成频数表
函 数 描 述
table(var1, var2, …, varN) 使用 N 个类别型变量(因子)创建一个 N 维列联表
xtabs(formula, data) 根据一个公式和一个矩阵或数据框创建一个 N 维列联表
prop.table(table, margins) 依margins定义的边际列表将表中条目表示为分数形式
margin.table(table, margins) 依margins定义的边际列表计算表中条目的和
addmargins(table, margins) 将概述边margins(默认是求和结果)放入表中
ftable(table) 创建一个紧凑的“平铺”式列联表
> mytable<-with(Arthritis,table(Improved))> mytableImproved None Some Marked 42 14 28 可以用prop.table()将这些频数转化为比例值:
> prop.table(mytable)Improved None Some Marked 0.5000000 0.1666667 0.3333333 或使用prop.table()*100转化为百分比:
2. 二维列联表
对于二维列联表,table()函数的使用格式为:mytale<-table(A,B)
其中的A是行变量,B是列变量。除此之外,xtabs()函数还可使用公式风格的输入创建列联表,
格式为:mytable<-xtabs(~A+B,data=mydata)
其中的mydata是一个矩阵或数据框。总的来说,要进行交叉分类的变量应出现在公式的右侧(即~符号的右方),以+作为分隔符。若某个变量写在公式的左侧,则其为一个频数向量(在数据已经被表格化时很有用)。
对于Arthritis数据,有:
> mytable<-xtabs(~Treatment+Improved,data=Arthritis)> mytable ImprovedTreatment None Some Marked Placebo 29 7 7 Treated 13 7 21可以使用margin.table()和prop.table()函数分别生成边际频数和比例。行和与行比
例可以这样计算:
> margin.table(mytable,1)TreatmentPlacebo Treated 43 41 > prop.table(mytable,1) ImprovedTreatment None Some Marked Placebo 0.6744186 0.1627907 0.1627907 Treated 0.3170732 0.1707317 0.5121951列和与列比例可以这样计算:
> margin.table(mytable,2)Improved None Some Marked 42 14 28 > prop.table(mytable,2) ImprovedTreatment None Some Marked Placebo 0.6904762 0.5000000 0.2500000 Treated 0.3095238 0.5000000 0.7500000各单元格所占比例可用如下语句获取:
> prop.table(mytable) ImprovedTreatment None Some Marked Placebo 0.34523810 0.08333333 0.08333333 Treated 0.15476190 0.08333333 0.25000000可以使用addmargins()函数为这些表格添加边际和
> addmargins(mytable) ImprovedTreatment None Some Marked Sum Placebo 29 7 7 43 Treated 13 7 21 41 Sum 42 14 28 84> addmargins(prop.table(mytable)) ImprovedTreatment None Some Marked Sum Placebo 0.34523810 0.08333333 0.08333333 0.51190476 Treated 0.15476190 0.08333333 0.25000000 0.48809524 Sum 0.50000000 0.16666667 0.33333333 1.00000000在使用addmargins()时,默认行为是为表中所有的变量创建边际和
> addmargins(prop.table(mytable,1),2)#仅添加了各行的和 ImprovedTreatment None Some Marked Sum Placebo 0.6744186 0.1627907 0.1627907 1.0000000 Treated 0.3170732 0.1707317 0.5121951 1.0000000注意 table()函数默认忽略缺失值(NA)。要在频数统计中将NA视为一个有效的类别,请设定参数useNA="ifany"。.
使用gmodels包中的CrossTable()函数是创建二维列联表的第三种方法。CrossTable()
函数仿照SAS中PROC FREQ或SPSS中CROSSTABS的形式生成二维列联表
> CrossTable(Arthritis$Treatment,Arthritis$Improved)CrossTable()函数有很多选项,可以做许多事情:计算(行、列、单元格)的百分比;指
定小数位数;进行卡方、Fisher和McNemar独立性检验;计算期望和(皮尔逊、标准化、调整的
标准化)残差;将缺失值作为一种有效值;进行行和列标题的标注;生成SAS或SPSS风格的输出。
3.多维列联表
table()和xtabs()都可以基于三个或更多的类别型变量生成多维列联margin.table()、prop.table()和addmargins()函数可以自然地推广到高于二维的情况。另外,ftable()函数可以以一种紧凑而吸引人的方式输出多维列联表
> mytable<-xtabs(~Treatment+Sex+Improved,data=Arthritis), , Improved = None SexTreatment Female Male Placebo 19 10 Treated 6 7, , Improved = Some SexTreatment Female Male Placebo 7 0 Treated 5 2, , Improved = Marked SexTreatment Female Male Placebo 6 1 Treated 16 5 > ftable(mytable) Improved None Some MarkedTreatment Sex Placebo Female 19 7 6 Male 10 0 1Treated Female 6 5 16 Male 7 2 5> margin.table(mytable,c(1,3))#治疗情况(Treatment) × 改善情况(Improved)的边际频数
ImprovedTreatment None Some Marked Placebo 29 7 7 Treated 13 7 21