你的位置:首页 > 数据库

[数据库]R提高篇(四): 数据管理二


目录:

  • 数学函数
  • 统计函数
  • 应用示例
  • 控制流

数学函数


  • ceiling(x):  大于等于 x  的最小整数, 如:  ceiling(3.213)  --> 4
  • floor(x):     小于等于 x 的最大整数,如:  floor(3.6534) --> 3
  • trunc(x):    取x的整数部分,          如:  trunc(5.999)  --> 5
  • round(x,digits=n):   将x舍入为指定的小数,                       如: round(3.4567,2)  --> 3.46
  • signif(x,digits=n):  将x舍入为指定的有效数字位数              如:  signif(3.4567,2)  --> 3.5

统计函数


  • mean(x):  平均数,语法: mean(x, trim = 0, na.rm = FALSE, ...)
    1. trim:  (0 to 0.5),  如:mean(x, trim = 0.1), 表示先把x的最大的10%的数和最小的10%的数去掉,然后剩下的数算平均
    2. 示例代码
       x <- c(2,4,6,8,10,11) mean(x,trim = 0.2)  #6*0.2=1.2(取整),除去最大最小值11、2 ,实际计算 4 6 8 10的平均 --> 7 mean(x)       # 41/6 --> 6.833

  • median(x) : 中位数,语法: median(x, na.rm = FALSE) ,从小到大或是从大到小排列时最中间的那个或是最中间两个数的平均值,主要用于算一个整体(小组)的一般水平...
    > x <- c(2,4,6,9,10,11)> median(x)[1] 7.5> x <- c(2,4,9,10,11)> median(x)[1] 9

  • med(x): 绝对中位数,语法:mad(x, center = median(x), constant = 1.4826, na.rm = FALSE,low = FALSE, high = FALSE)
    1. 主要是考虑到数据列中一些与均值相差较远的离谱数据在求均值和方差时候,尤其是求方差时对结果产生较大的影响
    2. 实际上计算mad的过程就是:constant * cMedian(abs(x - center))
    3. low,high: 当中位数是两个数字时,根据设置的参数取最小或最大的值
    4. 示例代码
      > x <- c(1,2,3,5,7,8)> mad(x)[1] 3.7065> #分解mad(x)计算过程> y <- abs(x - median(x));y[1] 3 2 1 1 3 4> z <- median(y);z[1] 2.5> 1.4826 * z[1] 3.7065

  • rang(x): 求值域, 语法:range(..., na.rm = FALSE)
    > x <- c(1,2,3,5,7,8)> y <- range(x);y[1] 1 8> diff(y)  #滞后差分[1] 7

  • sd(x): 标准差,语法:sd(x, na.rm = FALSE), 标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值
    1. 标准差也被称为标准偏差,或者实验标准差,公式为,  ,
    2. 公式意义:所有数减去其平均值的平方和,所得结果除以该组数之个数减一 (上面的公式有误),再把所得值开根号,所得之数就是这组数据的标准差
    3. 标准差应用于投资上,可作为量度回报稳定性的指标。标准差数值越大,代表回报远离过去平均数值,回报较不稳定故风险越高。相反,标准差数值越小,代表回报较为稳定,风险亦较小
    4. 代码示例:
      > x <- c(1,2,3,4)> sd(x)[1] 1.290994> m <- mean(x);> y <- sum((x - m)^2)/(length(x) -1)> sqrt(y)[1] 1.290994

 

  • scale(x): 为数据对象x按列进行中心化或标准化,语法:scale(x, center = TRUE, scale = TRUE)

    1. 数据的中心化是指数据集中的各项数据减去数据集的均值
    2. 标准化是指中心化之后的数据在除以数据集的标准差
    3. 示例代码:
      > data <- c(1, 2, 3, 6, 3)> scale(data)      [,1][1,] -1.0690450[2,] -0.5345225[3,] 0.0000000[4,] 1.6035675[5,] 0.0000000attr(,"scaled:center")[1] 3attr(,"scaled:scale")[1] 1.870829

  •  quantile(x): 求百分位数,语法:quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE, names = TRUE,...)
    1. 默认计算方法:要计算的点到起始点的距离/终点到起始点的距离=要计算的比例
    2. 示例代码:
      > m <- c(1:20)> quantile(m,probs = c(0.25,0.75,1)); 25%  75% 100% 5.75 15.25 20.00 > (20 -1)*0.25 + 1[1] 5.75

 应用示例


  • 根据如下表格中的数据,按成绩对学生进行ABCDEF分等级,最后按姓氏和名字进行排序输出
  • 示例数据如下,保存本地 student.rda 文件中
  • 第一步: 同于三门学科分值相差甚远,首选必须将变量进行标准化,让数据变得可比较, 每科成绩用单位标准差表示,如下
    > setwd("E:\\R")> load(file = "roster.rda")> options(digits = 2) #小数点后保留2位> z <- scale(roster[,2:4])> z   math science english1  0.013  1.078  0.5872  1.143  1.591  0.0373 -1.026 -0.847 -0.6974 -1.649 -0.590 -1.2475 -0.068 -1.489 -0.3306  0.128 -0.205  1.1377 -1.049 -0.847 -1.2478  1.432  1.078  1.5049  0.832  0.308  0.95410 0.243 -0.077 -0.697

  • 第二步:计算每行的平均得分获得综合得分,合并到花名册,如下:

    > score <- apply(z,MARGIN = 1,FUN = mean);> score  1   2   3   4   5   6   7   8   9  10 0.56 0.92 -0.86 -1.16 -0.63 0.35 -1.05 1.34 0.70 -0.18 > roster <- cbind(roster,score);roster      student math science english score1    John Davis 502   95   25 0.562  Angla Williams 600   99   22 0.923 Bullwinkle Moose 412   80   18 -0.864    David Jones 358   82   15 -1.165 Janice Makhammer 495   75   20 -0.636  Cheryl Cushing 512   85   28 0.357  Reuven Ytzrhak 410   80   15 -1.058     Greg Knox 625   95   30 1.349   Joel England 573   89   27 0.7010   Mary Rayburn 522   86   18 -0.18

  • 第三步:按百分位数进行等级划分,如下:

    > y <- quantile(roster$score,probs = c(0.8,0.6,0.4,0.2))> y 80%  60%  40%  20% 0.74 0.44 -0.36 -0.89 > roster <- within(roster,{+          grader <- NA+          grader[score >= y[1]] <- "A"+          grader[score < y[1] & score >= y[2]] <- "B"+          grader[score < y[2] & score >= y[3]] <- "C"+          grader[score < y[3] & score >= y[4]] <- "D"+          grader[score < y[4]] <- "E"+ })> roster      student math science english score grader1    John Davis 502   95   25 0.56   B2  Angla Williams 600   99   22 0.92   A3 Bullwinkle Moose 412   80   18 -0.86   D4    David Jones 358   82   15 -1.16   E5 Janice Makhammer 495   75   20 -0.63   D6  Cheryl Cushing 512   85   28 0.35   C7  Reuven Ytzrhak 410   80   15 -1.05   E8     Greg Knox 625   95   30 1.34   A9   Joel England 573   89   27 0.70   B10   Mary Rayburn 522   86   18 -0.18   C

  • 第四步: 将student变量拆分为firstname 和 lastname ,并按姓氏和名称排序,将结果保存为本地文件 studentGrade.rda

    > name <- strsplit(roster$student," ")Error in strsplit(roster$student, " ") : non-character argument> class(roster$student)  #查看student类型,是因子,必须转化成字符[1] "factor"

  • 正确代码如下:

    > name <- strsplit(as.character(roster$student)," ")> firstname <- sapply(name,"[",1) # "[" 是一个可以提取某个对象一部分的函数,在这里用来提取列表中name各成份中的第一或二个元素> lastname <- sapply(name,"[",2)> sGrade <- cbind(firstname,lastname,roster[,-1]) > sGrade[order(sGrade$lastname),]  firstname lastname math science english   score grader6   Cheryl  Cushing 512   85   28 0.3532485   C1    John   Davis 502   95   25 0.5592028   B9    Joel  England 573   89   27 0.6978361   B4    David   Jones 358   82   15 -1.1620473   E8    Greg   Knox 625   95   30 1.3378934   A5   Janice Makhammer 495   75   20 -0.6289776   D3 Bullwinkle   Moose 412   80   18 -0.8565414   D10    Mary  Rayburn 522   86   18 -0.1768163   C2    Angla Williams 600   99   22 0.9238259   A7   Reuven  Ytzrhak 410   80   15 -1.0476242   E> save(sGrade,file = "studentGrade.rda")

  •  

控制流


  • for :  示例: for(i in 1:10) print("hello")
  • while:     示例:
     i<-10 while (i>0) {  print("hello")  i <- i-1 }

  • ifelse:  语法: ifelse(cond,statement1,statement2) , 当 cond = true 时执行第一个语句,反之执行第二个
  • swith:  语法: switch(expression, case1, case2, case3....)
    x <- switch( 3, "first", "second", "third", "fourth")x