列联表是观测数据按两个或更多属性(定性变量)分类时所列出的频数分布表,它是由两个以上的变量进行交叉分类的频数分布表。交互分类的目的是将两变量分组,然后比较各组的分布状况,以寻找变量间的关系。

按两个变量交叉分类的,该列联表称为两维列联表;若按3个变量交叉分类,所得的列联表称为3维列联表,依次类推。一维列联表就是频数分布表。频数就是各个分组中属性出现的次数。

频数也称“次数”,对样本数据按某些属性进行分组,统计出各个组内含个体的个数,就是频数。

本文使用vcd包中的Arthritis数据集来演示如何创建列联表。

一,创建频数表

频数表用于探索类别型变量,常用table()和 xtabs()来创建频数表:

table(var1, var2, ...,varN)
xtabs(formula, data)

参数注释:

  • table()函数:使用N个类别变量(因子)创建一个N维列联表,
  • xtabs()函数:根据一个公式(~var1+var2+...+varN)创建一个N维列联表。

总体来说,要进行交叉分类的变量应出现在公式的右侧,即 ~ 符号的右方,以+  作为分割符。本文重点介绍一维列联表和二维列联表,对于高维列联表,不做介绍。

函数prop.table()以列联表作为参数,以margins定义的边际把列联表中的频数表示为比例关系。

prop.table(table,margins)

参数注释:table是列联表,margins是边际列表,1是第一个分类变量,2是第二个分类变量

函数margin.table()以列联表作为参数,以margins定义的边际列表来计算频数的和。

margin.table(table,margins)

参数注释:table是列联表,margins是边际列表,1是第一个分类变量,2是第二个分类变量

1,创建一维列联表

一维列联表是根据一个分类变量列出变量各个值得频数:

with(Arthritis,table(Improved))
xtabs(~Improved,data=Arthritis)

Improved是分类得变量名,None、Some和Marked是变量的值,数值是各个变量值出现的次数(频数)。

Improved
None Some Marked

2,创建二维列联表

二维列联表是指按照两个分类变量列出的频数表:

with(Arthritis,table(Improved,Sex))
xtabs(~Improved+Sex,data=Arthritis)

Sex和Improved是分类的变量名,两个分类交叉分类,查看两个分类之间的关系:

        Sex
Improved Female Male
None
Some
Marked

3,把列联表的频数转换为比例值

使用prop.table(),把列联表的频数转换为比例值

mytable <- xtabs(~Improved+Sex,data=Arthritis)
prop.table(mytable) Sex
Improved Female Male
None 0.29761905 0.20238095
Some 0.14285714 0.02380952
Marked 0.26190476 0.07142857

4,计算列联表的边际列表的和

使用margin.table(),按照边际列表计算列联表的频数之和

mytable <- xtabs(~Improved+Sex,data=Arthritis)
margin.table(mytable,) Improved
None Some Marked

二,自定义区间

按照分类变量来计算频数,有时不能满足需要,例如,按照年龄段来计算频数,每10年为一个年纪段,统计各个年龄段的人数。由于Arthritis数据集中并没有该分类变量,这就需要自定义区间,按照分组的间隔来制作频数分布表。

我从网上找到一个制作频率分布表的步骤,总共4步。

制作频率分布表的步骤如下:
1.求全距(全距亦称极差):从数据中找出最大值Max和最小值Min,并求出它们的差,本例中最大值Max=100,最小值Min=42,故全距为Max-Min=100-42=58,从全距可以初步了解数据的差异幅度,同时亦为决定组距与组数提供了依据。
2.决定组距与组数:组数D和组距K之间有关系式D>=(Max- Min)/K,本例中取K=5,则D= (Max-Min)/K=58/5,向上取整为12,故分为12组。
3.决定组限:组限就是表明每组两端的数值,其中每组的起点数值称为下限RL,终点数值称为上限RU,上限和下限也是数据的分点,通常区间是左闭右开型的:[RL ,  RU)
4.制作频率分布表:其中落在各个小组内的数据个数即为频数(或称次数),常用f表示,每一小组的频数与样本容量的比值即为频率。
step1,求极差
最大值是74,最小值是23,极差是51
age_range <- max(Arthritis$Age)-min(Arthritis$Age)

step2,决定组距和组数

把组距定为10,那么组数是6(不小于 51/10 的最小整数)

step3,决定分点

使用cut()函数来分割Age数据,设置断点向量breaks,以及每个区间的名称lables:

labels <- c("< 30", "30 - 40", "40 - 50", "50 - 60", "60 - 70", ">= 70")
breaks <- c(,,,,,,)

step4,制作频数分布表

使用cut()函数按照指定的断点来分割数据,得到各个分组,使用table()函数得到频数表:

mytable <- cut(Arthritis$Age, breaks = breaks, labels = labels, right = TRUE )
df <- as.data.frame(table(Age=mytable))
#names(df)[1] <- c('Age')

cut()函数返回的是mytable的类型是因子,也就是说,cut()函数返回的结果是因子向量:

class(mytable)
[] "factor"

查看频数分布表,按照Age(把mytable重命名为Age)因子进行分组,统计各个因子属性值的频数:

> table(Age=mytable)
Age
< - - - - >=

把频数分布表转换为数据框,得到二维表如下图所示:

> df
Age Freq
<
-
-
-
-
>=

step5,列出频率分布表

列出频率分布表,包括累积频数和累计频率

df <- transform(df, cumFreq = cumsum(Freq), FreqRate = prop.table(Freq))
df <- transform(df, cumFreqRate= cumsum(FreqRate))
df <- transform(df,FreqRate=round(FreqRate * ,), cumFreqRate= round(cumFreqRate*,))

查看频率分布表:

      Age Freq cumFreq FreqRate cumFreqRate
< 8.33 8.33
- 9.52 17.86
- 14.29 32.14
- 34.52 66.67
- 32.14 98.81
>= 1.19 100.00

参考文档:

SPSS——描述性统计分析——列联表

频数分布表

R实战 第十篇:列联表和频数表的更多相关文章

  1. R实战 第三篇:数据处理(基础)

    数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...

  2. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  3. R实战 第十二篇:随机数

    由R生成的随机数实际上伪随机数,也就是说,随机数是由某种算法而不是真正的随机过程产生的,随机数生成器需要一个初始值来生成数字,该初始值叫做种子.通过把种子设置为特定的值,可以保证每次运行同一段代码时都 ...

  4. R实战 第五篇:绘图(ggplot2)

    ggplot2包实现了基于语法的.连贯一致的创建图形的系统,由于ggplot2是基于语法创建图形的,这意味着,它由多个小组件构成,通过底层组件可以构造前所未有的图形.ggplot2可以把绘图拆分成多个 ...

  5. R实战 第三篇:数据处理

    在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量.数据处理通常包括增加新的变量.处理缺失值.类型转换.数据排序.数据集的合并和获取子集等. 一,增加新的变量 通常需要 ...

  6. R实战 第七篇:绘图文本表

    文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...

  7. R实战 第十一篇:处理缺失值

    在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...

  8. R实战 第八篇:重塑数据(reshape2)

    数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...

  9. R实战 第六篇:数据变换(aggregate+dplyr)

    数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的:然 ...

随机推荐

  1. Java ——基础语法

    package myhello; // 本类所在的包的路径 import af.util.AfMath; // 导入对应的类 import java.util.Random; // 导入随机数的类 p ...

  2. ubuntu通过apt-get安装JDK8

    安装python-software-properties apt-get install python-software-properties apt-get install software-pro ...

  3. 第六章 Hyper-V 2012 R2 的检查点

    "检查点"是 Windows Server 2012 R2 中对 Windows Server 2012 及以前版本的 Hyper-V"快照"功能的新称呼.之所 ...

  4. .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)

    Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...

  5. Python基础知识:if语句

    1.模拟网站确保用户名是否重复的方式,无视大小写,用到函数lower() #检查用户名是否重复 current_users=['admin','alex','lebran','kaobi','Jame ...

  6. 【PAT】B1063 计算谱半径(20 分)

    水题,没有难点 #include<stdio.h> #include<algorithm> #include<math.h> using namespace std ...

  7. MySQL 聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  8. Mybatis&orcale update语句中接收参数为对象

    Mybatis的 mapper.xml 中 update 语句使用 if 标签判断对像属性是否为空值. UserDTO是传过来参数的类型,userDTO是在mapperDao接口中给更新方法的参数起的 ...

  9. 静态库lib调试

    1.首先生成lib文件的解决方案编译通过. 2.将最新的lib和头文件在需要调用的exe中,替换掉. 3.复制需要调试的cpp文件到exe解决方案下,并添加现有项. 4.运行无错误后,添加断点即可调试 ...

  10. Pair Programming 2

    学生-社团匹配程序 项目流程: 1. 分析讨论 2. 分工合作 3. 代码规范 4. 编码实现 5. 模块结合 6. 测试修改 7. 数据样例 8. 心得体会 9. GitHub链接 结对队友:陈文举 ...