参考资料:R语言实战【第2版】
导入分析用数据案例
library(vcd)
head(Arthritis)
1、生成频数表
R语言提供了用于创建频数表和列联表的若干种方法。如下:
函数 | 描述 |
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 | 创建一个紧凑的“平铺”式列联表 |
1、一维列联表
# 使用table()函数
mytable<-with(Arthritis,table(Improved))
mytable
table(Arthritis$Improved)
# 使用prop.table()函数将频数转化为比例值
prop.table(mytable)
# 使用prop.table()*100转化为百分比
prop.table(mytable)*100
2、二维列联表
对于二维列联表,table()函数的使用格式为:
mytable<-table(A,B);其中,A是行变量,B是列变量。
xtabs()函数还可以使用公式风格的输入创建联列表,格式:
mytable<-xtabs(~A+B,data=mydata);其中mydata是一个矩阵或数据框。总的来说,要进行交叉分类的变量应出现在公式的右侧(即~符号的右方),以+作为分隔符。若某个变量写在公式的左侧,则其为一个频数向量(在数据已经被表格化时很有用)。
# 使用table()函数
table(Arthritis$Treatment,Arthritis$Improved)
with(Arthritis,table(Treatment,Improved))
# 使用xtabs()函数
mytable<-xtabs(~Treatment+Improved,data=Arthritis)
mytable
# 使用margin.table()函数生成边际频数
margin.table(mytable,1)
margin.table(mytable,2)
# 使用prop.table()函数生成比例值
prop.table(mytable,1)
prop.table(mytable,2)
上例中margin.table()函数和prop.table()函数中的第二个参数margin是指定按行或按列进行汇总。
还可以使用addmargins()函数为table添加边际的和。在使用addmargins()函数时,默认行为是为表中所有变量创建边际和。如下:
# 对列进行汇总
addmargins(mytable,margin = 1)
margin.table(mytable,margin=2)
# 对行进行汇总
addmargins(mytable,margin=2)
margin.table(mytable,margin=1)
# 对表格进行百分比求和
addmargins(prop.table(mytable))
addmargins(prop.table(mytable,1),2)
addmargins(prop.table(mytable,2),1)
注意:table()函数默认忽略缺失值(NA)。要在频数统计中奖NA视为一个有效的类别,需要设定参数useNA="ifany"。
使用gmodels包中的CrossTable()函数时创建二维列联表的第三种方法。CrossTable()函数有很多选项,可以做很多事情:如计算(行、列、单元格)的百分比、指定小数位数、进行卡方、Fisher和McNemar独立性检验、计算期望和(皮尔逊、标准化、调整的标准化)残差、将缺失值作为一种有效值、进行行标题和列标题的标注等等。如下:
# 加载gmodels包
library(gmodels)
# 应用CrossTable函数
CrossTable(Arthritis$Treatment,Arthritis$Improved)
3、多维列联表
table()和xtabs()函数都可以给予三个或更多类型变量生成多维列联表。margin.table()、prop.table()和addmargins()函数可以自然地推广到高于二维的情况。另外,ftable()函数可以以只用紧凑的方式输出多维列联表。如下:
# 三维列联表
mytable<-xtabs(~Treatment+Sex+Improved,data=Arthritis)
mytable
# 紧凑格式
ftable(mytable)
# 求边际和
margin.table(mytable,1) # mytable的第一个变量
margin.table(mytable,2) # mytable的第二个变量
margin.table(mytable,3) # mytable的第三个变量
margin.table(mytable,c(1,3)) # 求第1和第3个交叉的和
margin.table(mytable,c(1,2)) # 求第1和第2个变量交叉的和
ftable(prop.table(mytable,c(1,2)))
ftable(addmargins(prop.table(mytable,c(1,2)),3))
ftable(addmargins(prop.table(mytable,c(1,2))*100,3))