“ 本章节是数据预处理的第一步:了解数据(集)。只有充分了解了数据,我们才能对数据做进一步的预处理和后续深入的分析。”
目录
1 数据结构
str()
dim()
head()
2 描述性统计分析
summary()
psych::describe()
分组计算doBy::summaryBy
分组计算psych::describeBy
3 频数和列联表
table 一维计数
xtabs 多维(交叉)计数
gmodels::CrossTable #列联表
01
—
数据结构
严格来讲“数据结构”不是基本统计分析的内容,但是这是了解数据的第一步,因此这里做简单普及!推荐使用str()函数
class() # 数据类型dim() # 数据(集)的行列数nrow() # 数据(集)的行数,等价于dim(mtcars)[1]ncol() # 数据(集)的列数,等价于dim(mtcars)[2]View() # 查看数据(集),以表格形式展示 如下图1head(X,n) # 显示数据集前n行str() # 查看数据(集)类型、行列数,每列的数据类型和简要数据概况
图1 View(mtcars)
> data(mtcars) > class(mtcars) # 数据类型[1] "data.frame" > dim(mtcars) # 数据(集)的行列数[1] 32 11> > > nrow(mtcars) # 数据(集)的行数,等价于dim(mtcars)[1][1] 32> dim(mtcars)[1][1] 32> > ncol(mtcars) # 数据(集)的列数,等价于dim(mtcars)[2][1] 11> dim(mtcars)[2][1] 11
> str(mtcars)'data.frame': 32 obs. of 11 variables: $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl : num 6 6 4 6 8 6 8 4 4 6 ... $ disp: num 160 160 108 258 360 ... $ hp : num 110 110 93 110 175 105 245 62 95 123 ... $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... $ wt : num 2.62 2.88 2.32 3.21 3.44 ... $ qsec: num 16.5 17 18.6 19.4 17 ... $ vs : num 0 0 1 1 0 1 0 1 1 1 ... $ am : num 1 1 1 0 0 0 0 0 0 0 ... $ gear: num 4 4 4 3 3 3 3 4 4 4 ... $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
02
—
描述性统计分析
描述性统计分析主要是认识数据的整体状况,例如是否缺失、均值、方差、中位数等描述性统计变量。推荐使用summary()、psych::describe()
## 描述统计# 1.1 summary()summary(mtcars) #具体查看下方示例
# 1.2 psych::describe library(psych)psych::describe(mtcars) #具体查看下方示例
# 1.3 Hmisc::describelibrary(Hmisc)describe(df)
# 1.4 aggregate() # 分组描述统计分析myvars<-c("mpg","hp","wt")aggregate(mtcars[myvars],by=list(am=mtcars$am),mean)#输出结果am mpg hp wt1 0 17.14737 160.2632 3.7688952 1 24.39231 126.8462 2.411000
# 1.5 doBy包和psych包 具体查看下方示例# 分组计算的扩展,doBy包和psych包提供了分组计算的描述性统计量的函数,doBy包中的summaryBy()函数使用的基本格式
summary()函数提供了最小值、最大值、四分位数、均值,另外还可以因子向量和逻辑型向量的频数统计。
> summary(mtcars) mpg cyl disp hp drat wt qsec Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0 Min. :2.760 Min. :1.513 Min. :14.50 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 Median :19.20 Median :6.000 Median :196.3 Median :123.0 Median :3.695 Median :3.325 Median :17.71 Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7 Mean :3.597 Mean :3.217 Mean :17.85 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0 Max. :4.930 Max. :5.424 Max. :22.90 vs am gear carb Min. :0.0000 Min. :0.0000 Min. :3.000 Min. :1.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000 Median :0.0000 Median :0.0000 Median :4.000 Median :2.000 Mean :0.4375 Mean :0.4062 Mean :3.688 Mean :2.812 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000 Max. :1.0000 Max. :1.0000 Max. :5.000 Max. :8.000
psych::describe(mtcars) #推荐使用
> psych::describe(mtcars) vars n mean sd median trimmed mad min max range skew kurtosis sempg 1 32 20.09 6.03 19.20 19.70 5.41 10.40 33.90 23.50 0.61 -0.37 1.07cyl 2 32 6.19 1.79 6.00 6.23 2.97 4.00 8.00 4.00 -0.17 -1.76 0.32disp 3 32 230.72 123.94 196.30 222.52 140.48 71.10 472.00 400.90 0.38 -1.21 21.91hp 4 32 146.69 68.56 123.00 141.19 77.10 52.00 335.00 283.00 0.73 -0.14 12.12drat 5 32 3.60 0.53 3.70 3.58 0.70 2.76 4.93 2.17 0.27 -0.71 0.09wt 6 32 3.22 0.98 3.33 3.15 0.77 1.51 5.42 3.91 0.42 -0.02 0.17qsec 7 32 17.85 1.79 17.71 17.83 1.42 14.50 22.90 8.40 0.37 0.34 0.32vs 8 32 0.44 0.50 0.00 0.42 0.00 0.00 1.00 1.00 0.24 -2.00 0.09am 9 32 0.41 0.50 0.00 0.38 0.00 0.00 1.00 1.00 0.36 -1.92 0.09gear 10 32 3.69 0.74 4.00 3.62 1.48 3.00 5.00 2.00 0.53 -1.07 0.13carb 11 32 2.81 1.62 2.00 2.65 1.48 1.00 8.00 7.00 1.05 1.26 0.29
分组计算的扩展,doBy包和psych包提供了分组计算的描述性统计量的函数,doBy包中的summaryBy()函数使用的基本格式:
# doBy()包中summaryBy()函数的使用格式:# summaryBy(formula,data=dataframe,FUN=function)# formula接受以下格式:# var1+var2+var3+var4+……+varN~groupvar1+groupvar2+……#+groupvarN# 在~左侧的变量师需要分析的数值型变量,而在右侧的变量是类别型的分组变#量。library(doBy)summaryBy(mpg+hp+wt~am,data=mtcars,FUN=mystats)# 输出结果 am mpg.n mpg.mean mpg.stdev mpg.skew mpg.kurtosis hp.n hp.mean hp.stdev hp.skew1 0 19 17.14737 3.833966 0.01395038 -0.8031783 19 160.2632 53.90820 -0.014225192 1 13 24.39231 6.166504 0.05256118 -1.4553520 13 126.8462 84.06232 1.35988586 hp.kurtosis wt.n wt.mean wt.stdev wt.skew wt.kurtosis1 -1.2096973 19 3.768895 0.7774001 0.9759294 0.14156762 0.5634635 13 2.411000 0.6169816 0.2103128 -1.1737358
library(psych)myvars<-c("mpg","hp","wt")describeBy(mtcars[myvars],list(am=mtcars$am))#输出结果Descriptive statistics by group am: 0 vars n mean sd median trimmed mad min max range skew kurtosis sempg 1 19 17.15 3.83 17.30 17.12 3.11 10.40 24.40 14.00 0.01 -0.80 0.88hp 2 19 160.26 53.91 175.00 161.06 77.10 62.00 245.00 183.00 -0.01 -1.21 12.37wt 3 19 3.77 0.78 3.52 3.75 0.45 2.46 5.42 2.96 0.98 0.14 0.18-------------------------------------------------------------------- am: 1 vars n mean sd median trimmed mad min max range skew kurtosis sempg 1 13 24.39 6.17 22.80 24.38 6.67 15.00 33.90 18.90 0.05 -1.46 1.71hp 2 13 126.85 84.06 109.00 114.73 63.75 52.00 335.00 283.00 1.36 0.56 23.31wt 3 13 2.41 0.62 2.32 2.39 0.68 1.51 3.57 2.06 0.21 -1.17 0.17
03
—
频数和列联表
推荐学习使用table、xtabs、gmodels::CrossTable
## 2.频数和列联表# 2.1 table #频数生成table(mtcars$vs)table(mtcars$gear)
# 将频数转换为比例 prop.table(table(mtcars$gear))# prop.table()*100转化成百分比
# 2.2 二维列联表# mytable<-table(A,B) A为行变量 B为列变量# xtabs()函数还可以使用公式风格的输入创建列联表# mytable<-xtabs(~A+B,data=mydata) #其中mydata是一个矩阵或者数据框# 三维以上列联表mytable<-xtabs(~Treatment+Sex+Improved,data=Arthritis)mytable <- xtabs(~gear+vs, data = mtcars) mytable
prop.table(mytable, 2) #按列计算百分比addmargins(mytable, 2) #增加行和
#使用CrossTable()创建二维列表# install.packages("gmodels")library(gmodels)CrossTable(mtcars$gear, mtcars$vs)
示例
> ## 2.频数和列联表> # 2.1 table #频数生成> table(mtcars$vs)
0 1 18 14 > table(mtcars$gear)
3 4 5 15 12 5 > > # 将频数转换为比例 > prop.table(table(mtcars$gear))
3 4 5 0.46875 0.37500 0.15625 > # prop.table()*100转化成百分比> > # 2.2 二维列联表> # mytable<-table(A,B) A为行变量 B为列变量> # xtabs()函数还可以使用公式风格的输入创建列联表> # mytable<-xtabs(~A+B,data=mydata) #其中mydata是一个矩阵或者数据框> # 三维以上列联表mytable<-xtabs(~Treatment+Sex+Improved,data=Arthritis)> mytable <- xtabs(~gear+vs, data = mtcars) > mytable vsgear 0 1 3 12 3 4 2 10 5 4 1> > prop.table(mytable, 2) #按列计算百分比 vsgear 0 1 3 0.66666667 0.21428571 4 0.11111111 0.71428571 5 0.22222222 0.07142857> addmargins(mytable, 2) #增加行和 vsgear 0 1 Sum 3 12 3 15 4 2 10 12 5 4 1 5> > #使用CrossTable()创建二维列表> # install.packages("gmodels")> library(gmodels)> CrossTable(mtcars$gear, mtcars$vs)
Cell Contents|-------------------------|| N || Chi-square contribution || N / Row Total || N / Col Total || N / Table Total ||-------------------------|
Total Observations in Table: 32
| mtcars$vs mtcars$gear | 0 | 1 | Row Total | -------------|-----------|-----------|-----------| 3 | 12 | 3 | 15 | | 1.504 | 1.934 | | | 0.800 | 0.200 | 0.469 | | 0.667 | 0.214 | | | 0.375 | 0.094 | | -------------|-----------|-----------|-----------| 4 | 2 | 10 | 12 | | 3.343 | 4.298 | | | 0.167 | 0.833 | 0.375 | | 0.111 | 0.714 | | | 0.062 | 0.312 | | -------------|-----------|-----------|-----------| 5 | 4 | 1 | 5 | | 0.501 | 0.645 | | | 0.800 | 0.200 | 0.156 | | 0.222 | 0.071 | | | 0.125 | 0.031 | | -------------|-----------|-----------|-----------|Column Total | 18 | 14 | 32 | | 0.562 | 0.438 | | -------------|-----------|-----------|-----------|