1. 背景
最近,一个朋友让我帮忙做一个图标,是这个样子的:
我看了一下,相关的统计参数:
- 最大值
- 最小值
- 极差
- 平均值
- 标准差
- 变异系数
我想,这个很容易,Excel就可以计算啊,但是作为R语言的用户,一定要用R语言解决才可以,所以我就写了一个函数,可以批量去生成多个性状的结果。
2. 参数的解释
「最大值」
❝最大值,即为已知的数据中的最大的一个值。一般可以通过排序比较求出。 ❞
就是一列的性状,最大的那个值,可以排序找到,也可以通过R语言的max
函数实现。
「最小值」
❝最大值,即为已知的数据中的最小的一个值。一般可以通过排序比较求出。 ❞
可以使用R语言的min
函数实现。
「极差」
❝极差又称范围误差或全距(Range),以R表示,是用来表示统计资料中的变异量数(measures of variation),其最大值与最小值之间的差距,即最大值减最小值后所得之数据。 ❞
公式为:
「平均数」
❝平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。它是反映数据集中趋势的一项指标。解答平均数应用题的关键在于确定“总数量”以及和总数量对应的总份数。 ❞
公式为:
「标准差」
❝标准差(Standard Deviation) ,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。 ❞
公式为:
「变异系数」
❝变异系数(Coefficient of Variation):当需要比较两组数据离散程度大小的时候,如果两组数据的测量尺度相差太大,或者数据量纲的不同,直接使用标准差来进行比较不合适,此时就应当消除测量尺度和量纲的影响,而变异系数可以做到这一点,它是原始数据标准差与原始数据平均数的比。CV没有量纲,这样就可以进行客观比较了。事实上,可以认为变异系数和极差、标准差和方差一样,都是反映数据离散程度的绝对值。其数据大小不仅受变量值离散程度的影响,而且还受变量值平均水平大小的影响。 ❞
公式为:
一般来说,变异系数越大,其离散程度的测度值越大,反之越小。
3. 编写函数
代码语言:javascript复制huizong = function (dd) {
func <- function(x) {
c(Max = max(x, na.rm = T),
Min = min(x, na.rm = T),
Range = max(x,na.rm = T) - min(x,na.rm = T),
Mean = mean(x, na.rm = T),
SD = sd(x, na.rm = T),
CV = sd(x, na.rm = T)/mean(x, na.rm = T) * 100)
}
sm <- as.data.frame(t(apply(dd, 2, func)))
return(sm)
}
「代码解释」
- 首先定义一个
func
的函数,里面包括最大值
,最小值
,极差
,标准差
,变异系数
。 - 然后使用
apply
函数,对数据框的列进行操作 - 最后返回汇总统计的结果
- 该函数的对象为一个由变量组成的数据框,数据类型都要是
数值
4. 模拟数据测试
首先,我们模拟一个20行5列的数据框,每一列都是数值的数据类型。
代码语言:javascript复制dat = as.data.frame(matrix(rnorm(100) 100,20))
head(dat)
数据预览如下:
代码语言:javascript复制> head(dat)
V1 V2 V3 V4 V5
1 99.22775 100.83753 99.90943 99.90854 100.29367
2 100.08306 99.41531 99.63319 99.87266 99.05906
3 100.13505 99.70253 100.10447 99.77704 99.86410
4 99.35719 101.84853 100.30296 101.70499 101.20019
5 99.91668 100.75037 97.67819 99.05026 100.94768
6 99.83361 102.15812 101.39169 100.25141 100.01505
调用函数huizong
> huizong(dat)
Max Min Range Mean SD CV
V1 101.9351 98.06976 3.865381 99.95366 1.1094485 1.1099628
V2 102.1581 98.36796 3.790160 99.82986 1.1060172 1.1079022
V3 101.3966 97.67819 3.718384 100.00764 0.9255205 0.9254498
V4 102.2607 98.74254 3.518178 100.26481 1.1106601 1.1077268
V5 101.3142 97.46381 3.850396 99.98475 0.9767153 0.9768643
可以看到,性状V1,V2,V3,V4,V5的汇总统计结果都出来了。在性状比较多时,可以将数值变量提取出来,运行该函数,可以非常清楚明了的显示数据的分布,判断数据是否有异常值。
5. 函数进一步
一般我们的数据中,还存在缺失值,我们也想将缺失值的个数作为一个汇总统计的指标加到函数中。可以在func
函数中增加代码:
Total_num = length(x),
Miss_num = length(x[is.na(x)])
这样,就会在汇总统计时,将总个数和缺失值的个数打印出来,结果更直观。
「完整代码:」
代码语言:javascript复制huizong = function (dd) {
func <- function(x) {
c(Total_num = length(x),
Miss_num = length(x[is.na(x)]),
Max = max(x, na.rm = T),
Min = min(x, na.rm = T),
Range = max(x,na.rm = T) - min(x,na.rm = T),
Mean = mean(x, na.rm = T),
SD = sd(x, na.rm = T),
CV = sd(x, na.rm = T)/mean(x, na.rm = T) * 100)
}
sm <- as.data.frame(t(apply(dd, 2, func)))
return(sm)
}
「模拟数据的运行结果:」
代码语言:javascript复制> huizong(dat)
Total_num Miss_num Max Min Range Mean SD CV
V1 20 0 101.9541 98.35714 3.596918 99.95419 0.9640907 0.9645325
V2 20 0 102.8735 98.67215 4.201304 99.82228 1.0420051 1.0438602
V3 20 0 101.2284 99.03172 2.196703 100.05352 0.5970004 0.5966811
V4 20 0 101.8059 97.41955 4.386303 99.74787 1.2059034 1.2089516
V5 20 0 103.2977 98.14745 5.150291 100.08225 1.1427214 1.1417823