- 生成频数表
创建频数表和列联表 的若干种方法
函数 | 描述 |
table(var1,var2,...,varN) | 使用N个类别型变量(因子)创建一个N维列联表 |
xtabs(formula,data) | 根据一个公式和一个矩阵或数据框创建一个N维列联表 |
prop.table(table,margins)·· | 依margins定义的边际列表计算将表中条目表示为分数形式 简单理解:每个观测值与行之和的比 如果margins没写,则代表每个观测值(确切说应该是单元格)站没有总数的比例 |
margin.table(table,margins) | 依margins定义的边际列表计算表中条目的和 简单理解:就是行之和 |
addmargins(table,margins) | 将概述边margins(默认是求和结果)放入表中 |
ftable(table) | 创建一个紧凑的“平铺”式列联表 |
- 一维列联表
table()生成简单的频数统计表
library(vcd)
head(Arthritis)
> table(Arthritis$Improved)
None Some Marked
42 14 28
> mytable <- with(Arthritis, #应该与table(Arthritis$Improved)等价的呀?
+ table(Improved))
> mytable
Improved
None Some Marked
42 14 28
> prop.table(mytable) #将这些频数转化为比例值
Improved
None Some Marked
0.50000········00 0.1666667 0.3333333
> prop.table(mytable)*100 #转化为百分比
Improved
None Some Marked
50.00000 16.66667 33.33333
- 二维列联表
- table()
二维表也可以使用table() ,格式为
mytable <- table(A,B)
A是行变量,B是列变量
- xtabs()
mytable <- xtabs(~A+B,data= mydata)
mydata是一个矩阵或数据框,总的来说,要进行交叉分类的变量应出现在公式的右侧(即~符号的右方),以 + 作为分隔符。若某个变量写在公式的左侧,其为一个频数向量(在数据已经被表格化时很有用)
> mytable <- xtabs(~ Treatment+Improved, data=Arthritis)
> mytable # frequencies
Improved
Treatment None Some Marked
Placebo 29 7 7
Treated 13 7 21
使用margin.table()求行和,使用prop.table()求每个观测值占行和的比例
> margin.table(mytable,1) # 1指代table(A,B)语句的第一个变量A
Treatment
Placebo Treated
43 41
> prop.table(mytable,1)
Improved
Treatment None Some Marked
Placebo 0.6744186 0.1627907 0.1627907
Treated 0.3170732 0.1707317 0.5121951
使用margin.table()求列和,使用prop.table()求每个观测值占列和的比例
> prop.table(mytable, 1) #2指代table(A,B)语句的第二个变量B
Improved
Treatment None Some Marked
Placebo 0.6744186 0.1627907 0.1627907
Treated 0.3170732 0.1707317 0.5121951
> prop.table(mytable, 2)
Improved
Treatment None Some Marked
Placebo 0.6904762 0.5000000 0.2500000
Treated 0.3095238 0.5000000 0.7500000
各单元格所占比例
> prop.table(mytable) # 各单元格占总数的比例
Improved
Treatment None Some Marked
Placebo 0.34523810 0.08333333 0.08333333
Treated 0.15476190 0.08333333 0.25000000
addmargins()添加表的边际和
> addmargins(mytable) # 添加行与列的和
Improved
Treatment None Some Marked Sum
Placebo 29 7 7 43
Treated 13 7 21 41
Sum 42 14 28 84
计算比例
> addmargins(prop.table(mytable)) #计算每个单元格占比的行列和
Improved
Treatment 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(prop.table(mytable, 1), 2) #仅添加行的和
Improved
Treatment None Some Marked Sum
Placebo 0.6744186 0.1627907 0.1627907 1.0000000
Treated 0.3170732 0.1707317 0.5121951 1.0000000
> addmargins(prop.table(mytable, 2), 1) #仅添加列的he
Improved
Treatment None Some Marked
Placebo 0.6904762 0.5000000 0.2500000
Treated 0.3095238 0.5000000 0.7500000
Sum 1.0000000 1.0000000 1.0000000
注:
table()函数默认忽略缺失值(NA),要在频数统计中将NA视为一个有效的类别,请设定参数 useNA=“ifany”ifany
- 使用CrossTable生成二维列联表
Cross Table()函数可以很多的事情,计算(行、列、单元格)的百分比,指定小数位数,进行卡方, Fisher(费希尔)和McNemar独立性检验 (两种检验都属于列联表数据的独立性检验);计算期望和(皮尔逊,标准化,调整的标准化)残差,将缺失值作为一种有效值,进行行和列标题的标注;生成SAS或SPSS风格的输出
更多参考 help(CrossTable)
> library(gmodels)
Warning message:
程辑包‘gmodels’是用R版本3.4.1 来建造的
> CrossTable(Arthritis$Treatment,Arthritis$Improved)
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
Total Observations in Table: 84
| Arthritis$Improved
Arthritis$Treatment | None | Some | Marked | Row Total |
--------------------|-----------|-----------|-----------|-----------|
Placebo | 29 | 7 | 7 | 43 |
| 2.616 | 0.004 | 3.752 | |
| 0.674 | 0.163 | 0.163 | 0.512 |
| 0.690 | 0.500 | 0.250 | |
| 0.345 | 0.083 | 0.083 | |
--------------------|-----------|-----------|-----------|-----------|
Treated | 13 | 7 | 21 | 41 |
| 2.744 | 0.004 | 3.935 | |
| 0.317 | 0.171 | 0.512 | 0.488 |
| 0.310 | 0.500 | 0.750 | |
| 0.155 | 0.083 | 0.250 | |
--------------------|-----------|-----------|-----------|-----------|
Column Total | 42 | 14 | 28 | 84 |
| 0.500 | 0.167 | 0.333 | |
--------------------|-----------|-----------|-----------|-----------|