R action 5

20171205(从有道迁移)

高级数据管理

  1. 示例问题:

    1. 给所有学生确定一个单一的成绩衡量指标,需要将这些科目的成绩组合起来;
    2. 将前20%的学生评定为A,接下来20%的学生评定为B,依次类推;
    3. 按字母顺序对学生排序
    4. 示例数据,学生成绩数据
    学生姓名 数 学 科 学 英 语
    John Davis 502 95 25
    Angela Williams 600 99 22
    Bullwinkle Moose 412 80 18
    David Jones 358 82 15
    Janice Markhammer 495 75 20
    Cheryl Cushing 512 85 28
    Reuven Ytzrhak 410 80 15
    Greg Knox 625 95 30
    Joel England 573 89 27
    Mary Rayburn 522 86 18
    options(digits=2)
    Student <- c("John Davis","Angela Williams","Bullwinkle Moose","David Jones","Janice Markhammer", "Cheryl Cushing","Reuven Ytzrhak","Greg Knox","Joel England","Mary Rayburn")
    Math <- c(502,600,412,358,495,512,410,625,573,522)
    Science <- c(95,99,80,82,75,85,80,95,88,86)
    English <- c(25,22,18,15,20,28,15,30,27,18)
    roster <- data.frame(Student,Math,Science,English,stringsAsFactors=FALSE)
    
  2. 数值和字符处理函数

    1. 数学函数
    函 数 描 述
    abs(x) 绝对值 abs(-4) 返回值为4
    sqrt(x) 平方根 sqrt(25)返回值为5和25^(0.5)等价
    ceiling(x) 不小于x的最小整数 </br>ceiling(3.475) 返回值为4
    floor(x) 不大于x的最大整数 </br>floor(3.475) 返回值为3
    trunc(x) 向 0 的方向截取的x中的整数部分 </br>trunc(5.99) 返回值为5
    round(x, digits=n) 将x舍入为指定位的小数 </br>round(3.475, digits=2) 返回值为3.48
    signif(x, digits=n) 将x舍入为指定的有效数字位数 </br>signif(3.475, digits=2) 返回值为3.5
    cos(x)、sin(x) 、tan(x) 余弦、正弦和正切</br>cos(2) 返回值为–0.416
    acos(x) 、asin(x) 、atan(x) 反余弦、反正弦和反正切 </br>acos(-0.416)返回值为2
    cosh(x) 、sinh(x) 、tanh(x) 双曲余弦、双曲正弦和双曲正切 </br> sinh(2)返回值为3.627
    acosh(x) 、asinh(x) 、atanh(x) 反双曲余弦、反双曲正弦和反双曲正切 </br>asinh(3.627)返回值为2
    log(x,base=n) 对x取以n为底的对数
    log(x) log10(x) 为了方便起见 </br>log(x)为自然对数 </br>log10(x)为常用对数 </br>log(10)返回值为2.3026 </br>log10(10)返回值为1
    exp(x) 指数函数 exp(2.3026)返回值为10
    1. 统计函数

      1. 常用的统计函数其中许多函数都拥有可以影响输出结果的可选参数,请使用help()了解以上每个函数和其参数的用法。
      2. 函数
      函 数 描 述
      mean(x) 平均数 mean(c(1,2,3,4))返回值为2.5 </br>median(x) 中位数 median(c(1,2,3,4))返回值为2.5
      sd(x) 标准差 sd(c(1,2,3,4))返回值为1.29
      var(x) 方差 var(c(1,2,3,4))返回值为1.67
      mad(x) 绝对中位差(median absolute deviation) </br>mad(c(1,2,3,4))返回值为1.48
      quantile(x,probs) 求分位数。</br>其中x为待求分位数的数值型向量,</br>probs为一个由[0,1]之间的概率值组成的数值向量 </br># 求x的30%和84%分位点 </br>y <- quantile(x, c(.3,.84))
      range(x) 求值域 </br>x <- c(1,2,3,4) </br>range(x)返回值为c(1,4) </br>diff(range(x))返回值为3
      sum(x) 求和 </br>sum(c(1,2,3,4))返回值为10
      diff(x, lag=n) 滞后差分,</br>lag用以指定滞后几项。默认的lag值为1 </br>x<- c(1, 5, 23, 29) </br>diff(x)返回值为c(4, 18, 6)
      min(x) 求最小值 </br>min(c(1,2,3,4))返回值为1
      max(x) 求最大值 </br>max(c(1,2,3,4))返回值为4
      scale(x,center=TRUE,scale=TRUE) 为数据对象x按列进行中心化(center=TRUE)或标准化(center=TRUE,scale=TRUE);
      --均值和标准差的计算
      x <- c(1:8)
      mean(x)
      sd(x)
      
      1. 数据的标准化

        函数scale()对矩阵或数据框的指定列进行均值为0、标准差为1的标准化

        newdata <- scale(mydata)
        

        要对每一列进行任意均值和标准差的标准化,可以使用如下的代码

        newdata <- scale(mydata)*SD+M
        

        其中的M是想要的均值,SD为想要的标准差。

        要对指定列而不是整个矩阵或数据框进行标准化,你可以使用这样的代码:

        newdata <- transform(mydata,myvar=scale(myvar)*10+50)
        

        此句将变量myvar标准化为均值50、标准差为10的变量

    2. 概率函数

      1. 概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值;
      2. 在R中,概率函数形如:
      [dpqr]distribution_abbreviation()
      

      其中:

      • d = 密度函数(density)
      • p = 分布函数(distribution function)
      • q = 分位数函数(quantile function)
      • r = 生成随机数(随机偏差)
      1. 函数:
      分布名称 缩 写
      Beta分布 beta
      Logistic分布 logis
      二项分布 binom
      多项分布 multinom
      柯西分布 cauchy
      负二项分布 nbinom
      (非中心)卡方分布 chisq
      正态分布 norm
      指数分布 exp
      泊松分布 pois
      F分布 f
      Wilcoxon符号秩分布 signrank
      Wilcoxon秩和分布 wilcox
      Gamma分布 gamma
      t分布 t
      几何分布 geom
      均匀分布 unif
      超几何分布 hyper
      Weibull分布 weibull
      对数正态分布 lnorm
      1. 设定随机数种子

        在每次生成伪随机数的时候,函数都会使用一个不同的种子,因此也会产生不同的结果。你可以通过函数set.seed()显式指定这个种子,让结果可以重现(reproducible)。

        runif(5)
        set.seed(12345)
        runif(5)
        set.seed(12345)
        runif(5)
        
      2. 生成多元正态数据

        ==在模拟研究和蒙特卡洛方法中,经常需要获取来自给定均值向量和协方差阵的多元正态分布的数据。MASS包中的mvrnorm()函数可以让这个问题变得很容易?==

    3. 字符处理函数

    函 数 描 述
    nchar(x) 计算x中的字符数量 </br>x <- c("ab", "cde","fghij") </br>length(x)返回值为 3 </br>nchar(x[3])返回值为5
    substr(x, start, stop) 提取或替换一个字符向量中的子串 </br>x <- "abcdef" </br>substr(x, 2, 4)返回值为"bcd" </br>substr(x, 2, 4) <- "22222"(x将变成"a222ef")
    grep(pattern, x, </br>ignore.case=FALSE,fixed=FALSE) 在x中搜索某种模式。</br>若fixed=FALSE,则pattern为一个正则表达式。</br>若fixed=TRUE,则pattern为一个文本字符串。</br>返回值为匹配的下标 </br>grep("A",c("b","A","c"),fixed=TRUE)返回值为2
    sub(pattern, replacement, </br>x,ignore.case=FALSE, fixed=FALSE) 在x中搜索pattern,并以文本replacement将其替换。 </br>若fixed=FALSE,则pattern为一个正则表达式。 </br>若fixed=TRUE,则pattern为一个文本字符串 </br>sub("\s",".","Hello There")返回值为Hello.There。</br>注意,"\s"是一个用来查找空白的正则表达式;</br>使用"\s"而不用""的原因是,后者是R中的转义字符
    strsplit(x, split, fixed=FALSE) 在split处分割字符向量x中的元素。</br>若fixed=FALSE,则pattern为一个正则表达式。</br>若fixed=TRUE,则pattern为一个文本字符串 </br>y <- strsplit("abc", "")将返回一个含有1个成分、3个元素的列表,包含的内容为"a" "b" "c" </br>unlist(y)[2]和sapply(y, "[", 2)均会返回"b"
    paste(…, sep="") 连接字符串,分隔符为sep </br>paste("x", 1:3,sep="")返回值为c("x1", "x2", "x3") </br>paste("x",1:3,sep="M")返回值为c("xM1","xM2" "xM3") </br>paste("Today is", date())返回值为Today is Thu Jun 25 14:17:32 2011
    toupper(x) 大写转换 toupper("abc")返回值为"ABC"
    tolower(x) 小写转换 tolower("ABC")返回值为"abc"
    1. 其他使用函数
    函 数 描 述
    length(x) 对象x的长度 </br>x <- c(2, 5, 6, 9)</br>length(x)返回值为4
    seq(from, to, by) 生成一个序列 </br>indices <- seq(1,10,2) </br>indices的值为c(1, 3, 5, 7, 9)
    rep(x, n) 将x重复n次 </br>y <- rep(1:3, 2)</br>y的值为c(1, 2, 3, 1, 2, 3)
    cut(x, n) 将连续型变量x分割为有着n个水平的因子</br>使用选项ordered_result = TRUE以创建一个有序型因子
    pretty(x, n) 创建美观的分割点。</br>通过选取n+1个等间距的取整值,将一个连续型变量x分割为n个区间。</br>绘图中常用
    cat(... , file ="myfile", append =FALSE) 连接...中的对象,并将其输出到屏幕上或文件中(如果声明了一个的话)</br>firstname <- c("Jane")</br>cat("Hello" ,firstname, "\n")
    1. 将函数应用于矩阵和数据框
      1. R函数可以应用到一系列的数据对象上,包括标量、向量、矩阵、数组和数据框;
      2. apply()函数,可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。apply函数的使用格式为:apply(x,MARGIN,FUN,...)
        • x为数据对象
        • MARGIN是维度的下标,在矩阵或数据框中,MARGIN=1表示行,MARGIN=2表示列。
        • FUN是指定的函数
        • ...则包括了任何想传递给FUN的参数。
      mydata <- matrix(rnorm(30),nrow=6)
      apply(mydata,1,mean)
      apply(mydata,2,mean)
      apply(mydata,2,mean,trim=0.2)
      
  3. 示例问题的其中一种解决方案

    --options(digits=2)限定了输出小数点后数字的位数
    options(digits=2)
    
    --初始化示例数据
    Student <- c("John Davis","Angela Williams","Bullwinkle Moose","David Jones","Janice Markhammer", "Cheryl Cushing","Reuven Ytzrhak","Greg Knox","Joel England","Mary Rayburn")
    Math <- c(502,600,412,358,495,512,410,625,573,522)
    Science <- c(95,99,80,82,75,85,80,95,88,86)
    English <- c(25,22,18,15,20,28,15,30,27,18)
    roster <- data.frame(Student,Math,Science,English,stringsAsFactors=FALSE)
    
    --对第2列到第4列的成绩进行数据标准化
    z <- scale(roster[,2:4])
    
    --计算数据标准化后每个学生的成绩
    score <- apply(z,1,mean)
    
    --合并到roster数据集中
    roster <- cbind(roster,score)
    
    --求得80%,60%,40%,20%分数段的分数值
    y <- quantile(score,c(.8,.6,.4,.2))
    
    --计算评分
    roster$grade[score>=y[1]]<-"A"
    roster$grade[score<y[1]&score>=y[2]]<-"B"
    roster$grade[score<y[2]&score>=y[3]]<-"C"
    roster$grade[score<y[3]&score>=y[4]]<-"D"
    roster$grade[score<y[4]]<-"F"
    
    --按照空格分隔姓氏,并获取lastname和firstname
    name <- strsplit((roster$Student)," ")
    lastname <- sapply(name,"[",2)
    firstname <- sapply(name,"[",1)
    roster <- cbind(firstname,lastname,roster[,-1])
    
    --按照姓氏排序
    roster <- roster[order(lastname,firstname),]
    
    
  4. 控制流

    1. 基础概念
      • 语句(statement)是一条单独的R语句或一组复合语句(包含在花括号{ } 中的一组R语句,使用分号分隔);
      • 条件(cond)是一条最终被解析为真(TRUE)或假(FALSE)的表达式;
      • 表达式(expr)是一条数值或字符串的求值语句;
      • 序列(seq)是一个数值或字符串序列
    2. 重复和循环
      1. for循环,for循环重复地执行一个语句,直到某个变量的值不再包含在序列seq中为止。语法为:

        for(var in seq) statement

      2. while结构,while循环重复地执行一个语句,直到条件不为真为止。语法为:

        while(cond) statement

    3. 条件执行
      1. if-else结构,控制结构if-else在某个给定条件为真时执行语句。也可以同时在条件为假时执行另外的语句。语法为:

        if(cond) statement
        if(cond) statement else statement

      2. ifelse结构,ifelse结构是if-else结构比较紧凑的向量化版本,其语法为:

        ifelse(cond,statement1,statement2)

        若cond为TRUE,则执行第一个语句;若cond为FALSE,则执行第二个语句。

      3. switch结构,switch根据一个表达式的值选择语句执行。语法为:

        switch(expr,....)

        其中的...表示与expr的各种可能输出值绑定的语句

        feelings <- c("sad", "afraid")
        for (i in feelings)
          print(
            switch(i,
                   happy  = "I am glad you are happy",
                   afraid = "There is nothing to fear",
                   sad    = "Cheer up",
                   angry  = "Calm down now"
            )
        )
        
  5. 用户自编函数

    1. 自编函数结构

      myfunction <- function(arg1,arg,...){
          statements
          return(object)
      }
      
    2. 函数中的对象只在函数内部使用。返回对象的数据类型是任意的,从标量到列表皆可;

    3. 用函数warning()来生成一条错误提示信息

    4. 用message()来生成一条诊断信息

    5. 用stop()停止当前表达式的执行并提示错误。

    6. ==需要关注如何引入外部r包,和如何断点调试==

  6. 整合与重构

    1. 转置,转置(反转行和列)也许是重塑数据集的众多方法中最简单的一个了。使用函数t()即可对一个矩阵或数据框进行转置
    2. 整合数据,使用一个或多个by变量和一个预先定义好的函数来折叠(collapse)数据是比较容易的。
      1. 调用格式为:aggregate(x,by,FUN)
      2. x是待折叠的数据对象
      3. by是一个变量名组成的列表
      4. FUN则是用来计算描述性统计量的标量函数,它将被用来计算新观测中的值。
    3. ==reshape包,第三方包,要对包的使用再进一步了解==
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容