开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
函数介绍——描述性统计函数
首先是summary()函数,运行一次该函数,就可以对数据进行详细的统计。
先自定义一个变量,把mtcars的数据赋值给这个变量:
myvars <- mtcars[c("mpg",'hp','wt','am')]
使用summary()函数计算变量的数据,结果包括最小值,最大值,四分位数和数值型变量的均值。
在回归分析中也会大量用到summary()函数
Fivenum()函数和summary()函数类似,但可以返回5个基本的统计量,包括最小值,四分位数、中位数、上四位数、最大值。
fivenum(myvars$hp)
这里使用了$符取出单个数据列进行统计。
Hmisc包中的describe()函数也可以计算统计量,可以返回变量和观测的数量、缺失值和唯一值的数目、以及平均值、分位数、已经五个最大的值和五个最小的值
describe(myvars)
pastecs包中有一个stat.desc()函数可以计算种类繁多的描述性统计量,stat.desc()函数的选项参数中,x是一个数据框或者是时间序列
install.packages("pastecs")
library(pastecs)
stat.desc(myvars)
如果设置base选项等于true,那么就会计算一些基本值,包括全部值的数量、空值以及缺失值的数量、最小值、最大值、值域、还有总和
stat.desc(myvars,basic = T)
如果设置desc选项等于true,那么就会计算一些描述值,包括中位数、平均数、平均数的标准误、平均置信度为95%的置信空间、方差、标准差、以及变异系数等
> stat.desc(myvars,desc = T)
默认情况下,两个选项参数都是T
如果设置norm为T,那么就会计算一些统计值,包括正态分布统计量、偏度和峰度等
stat.desc(myvars,norm = T)
psych包中也有一个describe()函数,可以计算非缺失值的数量、平均数、标准差、中位数、截尾的均值、最大值、最小值、偏度和峰度等等内容
截尾的均值是去掉两头的数据取均值,就像打分时,去掉一个最低分、去掉一个最高分,然后中间数据求均值。
describe()函数可以通过设置trim参数,设置去除比例,如trim=0.1,则是去除数据中最高和最低的10%的部分
当两个包的函数名一样时,后面载入的包的函数会覆盖前面载入的包的函数,如果要使用前面一个包的函数,只需要在包后加冒号再使用即可,如:
Hmisc::describe()
Aggregate()函数可对数据进行分组描述,能够对数据按照指定的分组信息进行统计,将分组信息通过一个列表指定出来即可
例如我们使用mass这个包中的cars93数据集【93年许多不同汽车的指标】
> library(MASS)
以制造商这一列数据为例,
aggregate(Cars93[c("Min.Price","Max.Price","MPG.city")],by=list(Manufacturer=Cars93$Manufacturer),mean)
这样就是根据汽车制造商来对数据进行分组统计,计算每个汽车制造商产品平均的价格
还可以根据产地:
aggregate(Cars93[c("Min.Price","Max.Price","MPG.city")],by=list(origin=Cars93$Origin),mean)
还可以将mean函数替换成其他函数,比如sd,计算数据的标准差
aggregate(Cars93[c("Min.Price","Max.Price","MPG.city")],by=list(origin=Cars93$Origin),sd)
也可以一次性使用多个分组条件,只需要在列表中添加即可,例如同时使用产地和制造商来分组:
aggregate(Cars93[c("Min.Price","Max.Price","MPG.city")],by=list(origin=Cars93$Origin,Manufacturer=Cars93$Manufacturer),mean)
aggregate函数的缺点是一次只用使用一个统计函数,比如只能返回平均值、方差等,可以使用一些扩展包来进行分组计算并实现返回多种描述性统计量
首先是doBy包中的summaryBy()函数,summary_by(data, formula,id = NULL,FUN = mean..)
在波浪线左侧是需要分析的数值型变量,直接写数据框中的列的名字就可以,不需要添加引号;不同变量之间用+号表示;右侧的变量是类别型的分组变量;data参数指定数据集,fun参数指定统计函数,也可以是自定义函数:
summaryBy(mpg+hp+wt~am,data=myvars,FUN = mean)
Fun参数后面可以接多个统计函数,如
summaryBy(mpg+hp+wt~am,data=myvars,FUN = c(mean,sd,sum))
Psych包中的describe.by()函数和describe()函数能够计算相同的统计量,但是describe.by()函数可以通过分组来计算,只需要添加一个分组的列表,直接给定一个list即可:
describe.by(myvars,list(am=mtcars$am))
describe.by()适合详细查看每一个分组的统计值,但缺点是给出的统计值是固定不变的,没办法使用自定义的函数
函数介绍——频数统计函数
频数在数据分析中是非常重要的一个概念,因为经常需要进行分组统计,比较不同组之间的差异,这些都要涉及到频数的统计。因子是专门用来进行分组的,有因子才能分组,分组之后才能进行频数统计。
首先介绍一下R如何对数据进行分组:
如果一个数据本身就是因子,那么直接就可以进行分组,例如mtcars数据集,里面的“cyl”这一列数据直接就可以作为因子,依据气缸数的不同来进行分组。
用as.factor()函数将这列转换为因子数据:
cylfactors <- as.factor(mtcars$cyl)
然后可以使用split()函数对数据进行分组:
myvars <- dplyr::mutate(myvars,cylfactors1=cylfactors)
split(myvars,myvars$cylfactors1)
还可以使用cut()函数(如果没有明显的分类),cut可以对连续的数据进行切割,使用cut()函数对“mpg”这列进行分割,根据10-50切成10份,就是以步长为10,每十下一切:
cut(myvars$mpg,c(seq(10,50,10)))
此处seq()函数的选项参数是:seq(from=,to=,by=组距)
在分组之后,就可以用table()函数进行频数的统计,table()函数可以计算频数表。
table()函数的使用比较简单:
table(myvars$cylfactors1)
cut()函数的结果也可以使用table()来统计:
table(cut(myvars$mpg,c(seq(10,50,10))))
以上就是频数统计的做法
用频数除以总数就是频率值,R中可以直接使用prop.table()函数计算频率值:
prop.table(table(myvars$cylfactors1))
频率值*100就是百分比的结果。
那么二维的数据框如何进行频率统计呢?
可以使用table()或者是as.table()函数,选项参数输入两个因子就可以计算二维数据的频率了。
这里我们以vcd包中的风湿病数据集(arthritis)进行示范。
Arthritis数据集中的“treatment”、“sex”以及“improved”列都可以作为因子数据,因为它们是类型量,我们取两个作统计:
table(Arthritis$Treatment,Arthritis$Improved)
返回的结果是一个二维的列联表,横向是安慰剂组与治疗组的区分,每一列分别是“没有效果”、“有一些效果”、“很有效果”的区分:
如果变量太多,我们也可以先使用with()或者是attach()函数先加载数据:
with(data = Arthritis,table(Treatment,Improved))
这样就不用反复的书写变量名称
处理二维列联表还可以使用xtabs()函数,这个函数的好处是它的选项参数使用的是formula参数,这样就可以根据需要写成多种公式。
同样是“treatment”以及“improved”列,使用xtabs()函数计算如下:
xtabs(~ Treatment+Improved,data = Arthritis)
formula参数是可以省略的,结果和with()函数的一致
对于二维列联表我们还可以使用margin.table()和prop.table()函数分别计算边际频数与比例(边际频率),边际频数的意思就是单独按照行或者列的数据进行处理。
我们将xtabs()的结果保存到变量x中,再使用margin.table()函数统计一下x:
x <- xtabs(~ Treatment+Improved,data = Arthritis)
margin.table(x)
返回值只有一个,代表返回的是所有的结果,这里需要给定一个边际值,1或者2,1代表行,2代表列:
margin.table(x,1)
使用prop.table()函数计算比例(边际频率):
prop.table(x,1)
从边际和比例的计算结果可以看出,有治疗组有51%的比例是效果显著的,比边际频数41要大,说明药物是有用的。
再将margin.table()参数换成2,则是按列进行统计
margin.table(x,2)
addmargin()函数可以直接将边际的和添加到频数表中
addmargins(x)
这个函数也可单独计算行、列
addmargins(x,1)
addmargins(x,2)
我们也可以计算三维的列联表,加多一个参数就可以:
xtabs(~ Treatment+Improved+Sex,data = Arthritis)
结果看起来有点乱,这时候我们可以使用ftable()函数,它能将结果转换为一个平铺式的列联表
y <- xtabs(~ Treatment+Improved+Sex,data = Arthritis)
ftable(y)