一、描述性统计量
借助R语言内置的airquality数据集进行简单地演示:
1、集中趋势:均值和中位数
R
head(airquality)
# 求集中趋势
mean(airquality$Ozone, na.rm=T) # 求均值
median(airquality$Ozone, na.rm=T) # 求中位数
![](https://i-blog.csdnimg.cn/direct/00072063764f47f6975cd8b48168c359.png)
2、众数
众数(mode)是指在一组数据中出现频率最高的值。尽管R语言本身没有直接提供计算众数的内置函数,但可以使用其他函数和方法来计算众数。
R
# 假设Temp是离散数据
which.max(table(airquality$Temp))
# 假设Temp是连续数据:density$x[which.max(density$y)]
Density <- density(airquality$Temp)
Density
![](https://i-blog.csdnimg.cn/direct/0eaaf7c84bb54da88e266a3a7ceeae93.png)
3、离散趋势
R
# 先求极差:最大值-最小值
max(airquality$Ozone, na.rm=T) - min(airquality$Ozone, na.rm=T)
# 选取Ozone中所有非空元素组成的子集
Ozone.rm.na <- with(airquality, Ozone[is.na(Ozone)==F])
# 求平均差
sum(abs(Ozone.rm.na - mean(Ozone.rm.na))) / length(Ozone.rm.na)
# 求标准差
sd(airquality$Ozone, na.rm=T)
# 求方差
var(airquality$Ozone, na.rm=TRUE)
# 求变异系数
with(airquality, sd(Ozone, na.rm=T) / mean(Ozone, na.rm=T) * 100)
![](https://i-blog.csdnimg.cn/direct/0c31b7e9ef65417098a636a3c2fd6fa8.png)
4、峰度和偏度
需要先安装moments扩展包。
R
library(moments)
kurtosis(airquality$Ozone, na.rm=T) # 峰度
skewness(airquality$Ozone, na.rm=T) # 偏度
![](https://i-blog.csdnimg.cn/direct/265d6c601b844a68ba393ab982641917.png)
5、百分位数
R
quantile(airquality$Ozone, probs=seq(0,1,by=0.1), na.rm=TRUE)
![](https://i-blog.csdnimg.cn/direct/95b0a1452df6480d93d0639f3ddecc24.png)
6、Turkey五数
最小值、25百分位数、中位数、75百分位数、最大值
R
fivenum(airquality$Ozone, na.rm=TRUE)
![](https://i-blog.csdnimg.cn/direct/5e05ed99fa4d4aa992ee24a6ee51dd0e.png)
7、数量
R
length(airquality$Month)
table(airquality$Month)
![](https://i-blog.csdnimg.cn/direct/89d44768ee1d4326b590791f35835110.png)
8、算数截断平均数
mean()函数 中有一个参数trim,当指定trim时(0~0.5的数),表示先在数据两端各自截断相应比例的最大值和最小值,再计算平均数,此平均数就叫算数截断平均数,它更能有效地代表数据的集中趋势。
R
mean(airquality$Ozone, na.rm=T, trim=0.2)
![](https://i-blog.csdnimg.cn/direct/d42815bc420548ff83b114793facb6be.png)
二、列联表
table()函数
使用table()函数创建列联表时,只需要将相应的变量作为参数写进函数中即可。
当列联表多于二维度时,可以使用ftable()函数,使其呈现得更紧凑。
如下以vcd扩展包中的Arthritis数据集进行演示:
二维度列联表
R
library(vcd)
head(Arthritis)
# 二维度列联表
table.2D <- table(Arthritis$Treatment, Arthritis$Sex)
table.2D
![](https://i-blog.csdnimg.cn/direct/486f602cdde046559da08577deedb1ac.png)
三维度列联表
R
# 三维度列联表
table.3D <- table(Arthritis$Treatment, Arthritis$Sex, Arthritis$Improved)
table.3D
![](https://i-blog.csdnimg.cn/direct/b5be08e099764ac5b01eb6ecfe7adc94.png)
ftable()函数
更紧凑的呈现方式
R
ftable(table.3D)
![](https://i-blog.csdnimg.cn/direct/bd51139d5ac24b2aa83ea98998854f2f.png)
xtabs()函数
也可以使用xtabs()函数创建列联表。此函数的特点是以公式而非变量的形式传递进函数中。
二维度列联表
R
xtabs(~ Treatment + Sex, data=Arthritis)
![](https://i-blog.csdnimg.cn/direct/5430b867e39b49039248dcb4080a739b.png)
三维度列联表
R
xtabs(~ Treatment + Sex + Improved, data=Arthritis)
![](https://i-blog.csdnimg.cn/direct/9889e4f88f124f498d76cade57e7791c.png)
prop.table()函数
上述的table()函数和xtabs()函数得到的是频数表,可以使用prop.table()函数得到频率表,此函数通过margins参数指定频率分母的维度,默认将所有数值相加作为分母。
R
# 默认将所有数值相加作为分母
prop.table(table.2D)
# 按行计算频率
prop.table(table.2D, margin=1)
# 按列计算频率
prop.table(table.2D, margin=2)
![](https://i-blog.csdnimg.cn/direct/60317112994b4f8d85ca956822e89e19.png)
addmargins()函数
此函数可以在列联表中加入边际边,默认边际边求和,也可以通过FUN参数指定其它计算。
边际边是**边际频数(marginal frequencies)**的简称,它指的是列联表中行总和与列总和。
vcd扩展包中的mar_table()函数也可以同时加入按行或列求和的边际边。
按行和列求和
R
# 按行求和
addmargins(table.2D, margin=1)
# 按列求和
addmargins(table.2D, margin=2)
![](https://i-blog.csdnimg.cn/direct/bb4ff5b8bd744b83af1248be21463c48.png)
同时求行和列的和
R
# 分别按行和列求和
addmargins(table.2D, margin=1:2)
mar_table(table.2D)
![](https://i-blog.csdnimg.cn/direct/765e061535144cd6804bcc02fd33a3f7.png)
按列求平均
R
addmargins(table.2D, margin=2, FUN=mean)
![](https://i-blog.csdnimg.cn/direct/e5c1e79eb902497c82daf5074bfd7030.png)
margin.table()函数
R
margin.table(table.2D, margin=1)
margin.table(table.2D, margin=2)
![](https://i-blog.csdnimg.cn/direct/e27c4dfd19424096bc95ed51642c6c56.png)
三、同时输出多个统计量
用ggplot2包中的diamonds数据集做演示:
此数据集总共只有10列数据。
R
library(ggplot2)
head(diamonds)
![](https://i-blog.csdnimg.cn/direct/b9bbe373879a4db2a3783cc818df3541.png)
1、summary()函数
此函数R语言内置的统计量集合函数。当数据为数值时,它输出最小值、第1四分位数、中位数、平均数、第3四分位数和最大值;当数据为因子或类别时,它输出各个水平或类别的数量。
R
summary(diamonds)
![](https://i-blog.csdnimg.cn/direct/d4f8d185aa05483989f81364bffc4556.png)
2、describe()函数
psych扩展包的describe()函数输出的结果更丰富,包括数据量、均值、标准差、中位数、截断均值(默认截断比例为0.1),中位数绝对离差、最小值、最大值、全距、偏度、峰度和标准误差。
R
library(psych)
describe(diamonds)
![](https://i-blog.csdnimg.cn/direct/37284ac15dab4df8832e3fd9852122ca.png)
3、stat.desc()函数
pastecs扩展包 中的stat.desc()函数可以通过设置不同的参数来调整输出的统计量。
basic=TRUE(默认):计算观测值、空值和缺失值的数量,计算最大值、最小值、值域以及求和;
desc=TRUE:计算中位数、平均数、均值标准误差、95%的置信区间、方差、标准差以及变异系数;
norm=TRUE:计算正态分布的统计量,如峰度、偏度、显著程度。
R
library(pastecs)
options(digits=3) # 保留3位小数
stat.desc(diamonds, basic=FALSE, desc=FALSE)
![](https://i-blog.csdnimg.cn/direct/d8c68c12376842cdabfb29fcb172069a.png)