汇总统计?一个函数全部搞定!

育种数据 动物技术
邓飞    2020-12-30    731

1. 背景

最近,一个朋友让我帮忙做一个图标,是这个样子的:

图片.png

我看了一下,相关的统计参数:

  • 最大值
  • 最小值
  • 极差
  • 平均值
  • 标准差
  • 变异系数

我想,这个很容易,Excel就可以计算啊,但是作为R语言的用户,一定要用R语言解决才可以,所以我就写了一个函数,可以批量去生成多个性状的结果。

2. 参数的解释

「最大值」

最大值,即为已知的数据中的最大的一个值。一般可以通过排序比较求出。

就是一列的性状,最大的那个值,可以排序找到,也可以通过R语言的max函数实现。

「最小值」

最大值,即为已知的数据中的最小的一个值。一般可以通过排序比较求出。

可以使用R语言的min函数实现。

「极差」

极差又称范围误差或全距(Range),以R表示,是用来表示统计资料中的变异量数(measures of variation),其最大值与最小值之间的差距,即最大值减最小值后所得之数据。

公式为:

「平均数」

平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。它是反映数据集中趋势的一项指标。解答平均数应用题的关键在于确定“总数量”以及和总数量对应的总份数。

公式为:

「标准差」

标准差(Standard Deviation) ,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。

公式为:

「变异系数」

变异系数(Coefficient of Variation):当需要比较两组数据离散程度大小的时候,如果两组数据的测量尺度相差太大,或者数据量纲的不同,直接使用标准差来进行比较不合适,此时就应当消除测量尺度和量纲的影响,而变异系数可以做到这一点,它是原始数据标准差与原始数据平均数的比。CV没有量纲,这样就可以进行客观比较了。事实上,可以认为变异系数和极差、标准差和方差一样,都是反映数据离散程度的绝对值。其数据大小不仅受变量值离散程度的影响,而且还受变量值平均水平大小的影响。

公式为:

一般来说,变异系数越大,其离散程度的测度值越大,反之越小。

3. 编写函数

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列的数据框,每一列都是数值的数据类型。

dat = as.data.frame(matrix(rnorm(100)+100,20))
head(dat)

数据预览如下:

> 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)])

这样,就会在汇总统计时,将总个数和缺失值的个数打印出来,结果更直观。

「完整代码:」

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)
}

「模拟数据的运行结果:」

> 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

怎么样,赶快试一下吧!

本文来自微信公众号【育种数据分析之放飞自我】公众号ID:R-breeding;未经许可谢绝二次转载至其他网站。

本文为专栏作者授权科易网发表,版权归原作者所有。文章系作者个人观点,不代表科易网立场,转载请联系原作者。如有任何疑问,请联系ky@1633.com。
热门观点