在处理数据的过程中,我们经常需要对数据进行一些计算,例如求平均值、标准差、统计数据的出现频数等等,这些计算可以很容易的在excel中进行,但是当我们的数据较大或者需要根据一套数据的分组信息来分别对不同组数据进行统计时,使用excel进行重复操作的时间成本较高,并且在大量操作的过程中还容易出现一些错误。
本节内容我们来介绍如何使用R语言按照特定的条件对数据进行分类统计。
分组统计
aggregate()
aggregate()可以根据数据中的一个分组信息列,统计数据集中其它列数据对应各组的平均值、总和和标准偏差等。
aggregate()函数每次运行只能计算单一的一种数据统计。
aggregate有两种使用方式:
aggregate(x, by, FUN, ..., simplify = TRUE)aggregate(formula, data, FUN, ..., subset, na.action = na.omit)
aggregate(x, by, FUN, ..., simplify = TRUE)
aggregate(formula, data, FUN, ..., subset, na.action = na.omit)
各参数意义:
- x为进行统计的数据;
- by为分组方式;
- FUN为统计的函数,如平均值、总和、标准偏差等;
- simplify定义结果是否形成一个向量或矩阵;
- formula为分析的公式,data为分析数据;
- subset定义是否只对一部分数据进行分析;
- na.action定义对NA值的处理方式。
mtcars#载入示例数据集aggregate(mtcars$mpg, by=list(vs=mtcars$vs), mean)#根据vs的分组计算mpg中各组数据的平均值以矩阵形式返回 vs x1 0 16.616672 1 24.55714#另一种使用方式,基于公式aggregate(mpg~vs,data = mtcars, mean) vs mpg1 0 16.616672 1 24.55714
describeBy()
describeBy()函数是psych包中的一个命令,可以按照分组计算非缺失值的数量、平均数、标准差、中位数、截尾均值、绝对中位差、最小值、最大值、值域、偏度、峰度和平均值的标准误。
describeBy()函数的优势是可以同时返回各种统计结果。
describeBy(x, group=NULL,mat=FALSE,type=3,digits=15,...)
各参数意义:
- x为待分析的数据;
- group为分组变量;
- mat输出的文件是否是一个矩阵,如为FLASE,则输出一个list;
- type定义输出的文件采用哪种偏度和峰度;
- digits定义数据已矩阵形式输出需要现实多少个数值。
library(psych)describeBy(mtcars$mpg,mtcars$vs) Descriptive statistics by group group: 0 vars n mean sd median trimmed mad min max range skew kurtosis seX1 1 18 16.62 3.86 15.65 16.42 2.97 10.4 26 15.6 0.48 -0.05 0.91------------------------------------------------------------------ group: 1 vars n mean sd median trimmed mad min max range skew kurtosis seX1 1 14 24.56 5.38 22.8 24.34 6 17.8 33.9 16.1 0.41 -1.4 1.44
library(psych)
describeBy(mtcars$mpg,mtcars$vs)
Descriptive statistics by group
group: 0
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 18 16.62 3.86 15.65 16.42 2.97 10.4 26 15.6 0.48 -0.05 0.91
------------------------------------------------------------------
group: 1
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 14 24.56 5.38 22.8 24.34 6 17.8 33.9 16.1 0.41 -1.4 1.44
summaryBy()
上面的两个函数均是用来统计一个单数的数据变量,但很多时候我们需要针对一个分组同时统计多个不同的数据变量,此时可以使用summaryBy()函数。
summaryBy()函数是doBy包的一条命令,可以按照分组信息统计数据的个数、均值、标准偏差、偏度和峰度。
summaryBy(formula, data = parent.frame(), id = NULL, FUN = mean, keep.names=FALSE, p2d=FALSE, order=TRUE, full.dimension=FALSE, var.names=NULL, fun.names=NULL, ...)
summaryBy(formula, data = parent.frame(), id = NULL, FUN = mean, keep.names=FALSE, p2d=FALSE, order=TRUE, full.dimension=FALSE, var.names=NULL, fun.names=NULL, ...)
各参数意义:
- formula为进行统计的分析公式;
- data为待分析数据;
- id为在公式中没有指定的变量但是要在结果中显示;
- FUN进行计算的函数,如总数、均值、标准偏差等;
- keep.names如果为TRUE并且FUN中只有一个函数,则结果中变量的名字与输入的数据中变量名字一致;
- p2d是否要将位于括号内的变量名用小圆点代替;
- order是否结果文件中的变量按照公式中从右至左排列;
- full.dimension如果为TRUE,则结果文件的行数会进行重复直至与输入数据行数一致。
通过在公式的左侧添加多个数据变量,可以同时对多个变量进行分类统计。
library(doBy)summaryBy(mpg+disp+hp~vs,data = mtcars) vs mpg.mean disp.mean hp.mean1 0 16.61667 307.1500 189.722222 1 24.55714 132.4571 91.35714
library(doBy)
summaryBy(mpg+disp+hp~vs,data = mtcars)
vs mpg.mean disp.mean hp.mean
1 0 16.61667 307.1500 189.72222
2 1 24.55714 132.4571 91.35714
频数统计
除了上述讲到的计算平均数、标准偏差等应用,对分组数据进行频数统计也十分常用。
各组样本数目
统计一组数据中分别属于不同组的样本数目是一个很常见的问题,我们可以用table()函数来解决。
table(mtcars$vs) 0 1 18 14
table(mtcars$vs)
0 1
18 14
结果中现实属于“0”组的样本数为18,属于“1”组的样本数为14.
区间统计
在某些情况下我们可能并没有数据的分组信息,而只是想知道位于某一区间内数据的个数,此时可以使用cut()结合table()函数进行处理。
比如此时我们想知道mtcars数据集中mpg处于10-20以及20-30范围内的样本个数。
mpg $mpg,breaks = c(10,20,30))table(mpg)mpg(10,20] (20,30] 18 10
mpg $mpg,breaks = c(10,20,30))
table(mpg)
mpg
(10,20] (20,30]
18 10